/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
*/

#import "DTEFMobile.h"
#import <Cordova/CDV.h>
#import <DTEFMobile/CDTEFMobile.h>
#import <DTEFMobile/CDTEFMobilePromptX.h>


@implementation DTEFMobile

bool bRespostaRecebida;
CRetorno *oRetornoRespostaRecebida;
CDVInvokedUrlCommand *commandGlobal;
NSString *callbackId;
CDTEFMobile *oDTEFMobile;
NSString *resposta;

- (void)executeTransaction:(CDVInvokedUrlCommand*)command
{
  NSLog(@"D-TEF Mobile versão: %@", DTEF_MOBILE_VERSAO);

commandGlobal = command;
  callbackId = commandGlobal.callbackId;
  
  NSMutableDictionary *params = [command.arguments objectAtIndex:0];
  NSString *parameters = [params objectForKey:@"parameters"];

  bool bTelasPersonalizadas = false;
  NSString *telasPersonalizadas = [self valorParametro: parameters parametro:@"TipoInterface"];
  if ([telasPersonalizadas isEqualToString:@"1"])
  bTelasPersonalizadas = true;

  int iCodigoTransacao = 0;
  NSString *codigoTransacao = [self valorParametro:parameters parametro:@"CodigoTransacao"];
  if ((codigoTransacao != nil) && ![codigoTransacao isEqualToString:@""])
  iCodigoTransacao = [codigoTransacao intValue];

  if (bTelasPersonalizadas)
  {
    [self executaTransacao:iCodigoTransacao parameters:parameters];
  }
  /*
else
  // implementar tela da biblioteca
}*/
}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
  if (buttonIndex == 0) {
    NSLog(@"Cancel Tapped.");
  }
  else if (buttonIndex == 1) {
    NSLog(@"OK Tapped. Hello World!");
  }
}

- (void)confirmTransaction:(CDVInvokedUrlCommand*)command
{
  /*  NSLog(@"confirmTransaction");
  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"teste?" message:@"confirmTransaction"
                                                delegate:self
                                        cancelButtonTitle:@"Cancel"
                                        otherButtonTitles:@"Say Hello",nil];
  [alert show];
*/
  commandGlobal = command;
  callbackId = commandGlobal.callbackId;
  
  NSMutableDictionary *params = [command.arguments objectAtIndex:0];
  NSString *parameters = [params objectForKey:@"parameters"];
  
  bool bTelasPersonalizadas = false;
  NSString *telasPersonalizadas = [self valorParametro: parameters parametro:@"TipoInterface"];
  if ([telasPersonalizadas isEqualToString:@"1"])
  bTelasPersonalizadas = true;
  
  if (bTelasPersonalizadas)
  {
    [self executaTransacao:-2 parameters:parameters];
  }
  /*
  else
  // implementar tela da biblioteca
  }*/

}

- (void)undoTransaction:(CDVInvokedUrlCommand*)command
{
  /*  NSLog(@"undoTransaction");
  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"teste2?" message:@"undoTransaction"
                                                delegate:self
                                        cancelButtonTitle:@"Cancel"
                                        otherButtonTitles:@"Say Hello",nil];
  [alert show];
*/
  /*  NSLog(@"confirmTransaction");
  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"teste?" message:@"confirmTransaction"
  delegate:self
  cancelButtonTitle:@"Cancel"
  otherButtonTitles:@"Say Hello",nil];
  [alert show];
  */
  commandGlobal = command;
  callbackId = commandGlobal.callbackId;
  
  NSMutableDictionary *params = [command.arguments objectAtIndex:0];
  NSString *parameters = [params objectForKey:@"parameters"];
  
  bool bTelasPersonalizadas = false;
  NSString *telasPersonalizadas = [self valorParametro: parameters parametro:@"TipoInterface"];
  if ([telasPersonalizadas isEqualToString:@"1"])
  bTelasPersonalizadas = true;
  
  if (bTelasPersonalizadas)
  {
    [self executaTransacao:-3 parameters:parameters];
  }
  /*
  else
  // implementar tela da biblioteca
  }*/
  
}

- (void)finalizeTransaction:(CDVInvokedUrlCommand*)command
{
  /*
NSLog(@"finalizeTransaction");
  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"teste3?" message:@"finalizeTransaction"
                                                delegate:self
                                        cancelButtonTitle:@"Cancel"
                                        otherButtonTitles:@"Say Hello",nil];
  [alert show];
*/
  
  /*  NSLog(@"confirmTransaction");
  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"teste?" message:@"confirmTransaction"
  delegate:self
  cancelButtonTitle:@"Cancel"
  otherButtonTitles:@"Say Hello",nil];
  [alert show];
  */
  commandGlobal = command;
  callbackId = commandGlobal.callbackId;
  
  NSMutableDictionary *params = [command.arguments objectAtIndex:0];
  NSString *parameters = [params objectForKey:@"parameters"];
  
  bool bTelasPersonalizadas = false;
  NSString *telasPersonalizadas = [self valorParametro: parameters parametro:@"TipoInterface"];
  if ([telasPersonalizadas isEqualToString:@"1"])
  bTelasPersonalizadas = true;
  
  if (bTelasPersonalizadas)
  {
    [self executaTransacao:-4 parameters:parameters];
  }
  /*
  else
  // implementar tela da biblioteca
  }*/
}

- (void)executeTransactionSpecial:(CDVInvokedUrlCommand*)command
{
  commandGlobal = command;
  callbackId = commandGlobal.callbackId;
  
  NSMutableDictionary *params = [command.arguments objectAtIndex:0];
  NSString *parameters = [params objectForKey:@"parameters"];

  bool bTelasPersonalizadas = false;
  NSString *telasPersonalizadas = [self valorParametro: parameters parametro:@"TipoInterface"];
  if ([telasPersonalizadas isEqualToString:@"1"])
  bTelasPersonalizadas = true;

  int iCodigoTransacao = 0;
  NSString *codigoTransacao = [self valorParametro:parameters parametro:@"CodigoTransacao"];
  if ((codigoTransacao != nil) && ![codigoTransacao isEqualToString:@""])
  iCodigoTransacao = [codigoTransacao intValue];

  if (bTelasPersonalizadas)
  {
    [self executaTransacaoEspecial:iCodigoTransacao parameters:parameters];
  }
  /*
else
  // implementar tela da biblioteca
}*/
}



- (void)sendCallbackResponse:(CDVInvokedUrlCommand*)command
{
  NSLog(@"sendCallbackResponse");
  
  commandGlobal = command;
  NSMutableDictionary *params = [command.arguments objectAtIndex:0];
  NSLog(@"sendCallbackResponse params=%@", params);
  NSMutableDictionary *json = [params objectForKey:@"parameters"];
  if (json.count == 0)
    return;
  
  int resultado = [[json objectForKey:@"resultado"] intValue];
  int intRetorno = [[json objectForKey:@"intRetorno"] intValue];
  NSString *stringRetorno = [json objectForKey:@"stringRetorno"];
  oRetornoRespostaRecebida = [[CRetorno alloc] init];
  [oRetornoRespostaRecebida setResultado:resultado];
  [oRetornoRespostaRecebida setIntRetorno:intRetorno];
  [oRetornoRespostaRecebida setStringRetorno:stringRetorno];
  
  [self setRespostaRecebida:true];
}

- (void) setRespostaRecebida: (bool) value
{
  bRespostaRecebida = value;
}

- (NSString *) valorParametro:(NSString *) parameters parametro:(NSString*) parametro
{
  NSArray *pars = [parameters componentsSeparatedByString:@";"];
  
  for (int i = 0; i < [pars count]; i++)
  {
    NSString *par = pars[i];
    NSArray *keyvalues = [par componentsSeparatedByString:@"="];
    if ([keyvalues count] == 2)
    {
      NSString *key = keyvalues[0];
      NSString *value = keyvalues[1];

      NSLog(@"valorParametro key=[%@] value=[%@]", key, value);

      if ([key isEqualToString:parametro])
        return value;
    }
  }
  
  return @"";
}

- (void) defineParametrosDTEFMobile:(CDTEFMobile *)oDTEFMobile parameters:(NSString *)parameters
{
  NSArray *pars = [parameters componentsSeparatedByString:@";"];
  
  for (int i = 0; i < [pars count]; i++)
  {
    NSString *par = pars[i];
      
    NSArray *keyvalues = [par componentsSeparatedByString:@"="];
    if ([keyvalues count] == 2)
    {
      NSString *key = keyvalues[0];
      NSString *value = keyvalues[1];
      [oDTEFMobile setParameter:key paramValue:value];

      NSLog(@"defineParametrosDTEFMobile key=[%@] value=[%@]", key, value);
    }
  }
}

- (void) executaTransacao: (int) iCodigoTransacao parameters:(NSString *) parameters
{
  [self.commandDelegate runInBackground:^{
    oDTEFMobile = [[CDTEFMobile alloc] init];
    
    if (![parameters isEqualToString:@""])
    {
      [self defineParametrosDTEFMobile:oDTEFMobile parameters:parameters];
    }
    else
    {
      [oDTEFMobile setParameter:@"ValorTransacao" paramValue:@"0000"];
      [oDTEFMobile setParameter:@"CupomFiscal" paramValue:@"00001"];
      [oDTEFMobile setParameter:@"TipoServidorTEF" paramValue:@"0"];
    }
    
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setValue:[self valorParametro:parameters parametro:@"IPServidor"] forKey:@"IPServidor"];
    [defaults setValue:[self valorParametro:parameters parametro:@"PortaServidor"] forKey:@"PortaServidor"];
    [defaults setValue:[self valorParametro:parameters parametro:@"PinPadAtivo"] forKey:@"PinPadAtivo"];
    [defaults setValue:[self valorParametro:parameters parametro:@"NUMLOJA"] forKey:@"NUMLOJA"];
    [defaults setValue:[self valorParametro:parameters parametro:@"NUMESTAB"] forKey:@"NUMESTAB"];
    [defaults setValue:[self valorParametro:parameters parametro:@"NUMPDV"] forKey:@"NUMPDV"];
    
    [defaults setValue:[self valorParametro:parameters parametro:@"CNPJAutomacao"] forKey:@"CNPJAutomacao"];
    [defaults setValue:[self valorParametro:parameters parametro:@"IPServidorSiTef"] forKey:@"IPServidorSiTef"];
    [defaults setValue:[self valorParametro:parameters parametro:@"CodigoEmpresaSiTef"] forKey:@"CodigoEmpresaSiTef"];
    [defaults setValue:[self valorParametro:parameters parametro:@"NumeroTerminalSiTef"] forKey:@"NumeroTerminalSiTef"];
    [defaults setValue:[self valorParametro:parameters parametro:@"TipoServidorTEF"] forKey:@"TipoServidorTEF"];

    NSLog(@"Antes executeTransactionX");
    int iResultado;
    
    if (iCodigoTransacao == -2)
    {
      NSLog(@"confirmTransaction");
      int iNSU = [[self valorParametro:parameters parametro:@"NSUTransacao"] intValue];
      NSLog(@"confirmTransaction nsu=%d", iNSU);
      iResultado = [oDTEFMobile confirmTransaction:iNSU];
    }
    else if (iCodigoTransacao == -3)
    {
      NSLog(@"undoTransaction");
      int iNSU = [[self valorParametro:parameters parametro:@"NSUTransacao"] intValue];
      NSLog(@"undoTransaction nsu=%d", iNSU);
      iResultado = [oDTEFMobile undoTransaction:iNSU];
    }
    else if (iCodigoTransacao == -4)
    {
      NSLog(@"finalizaTransaction");
      iResultado = [oDTEFMobile finalizeTransaction];
    }
    else if (iCodigoTransacao >= 0)
    {
      NSLog(@"executeTransactionX");
      iResultado = [oDTEFMobile executeTransactionX:iCodigoTransacao view:self];
    }
    else
      iResultado = 11;
    
    NSLog(@"executaTransacao resultado = %d", iResultado);
    
    if (iResultado == 0)
    {
      NSLog(@"executeTransactionX resultado 0");
      NSMutableDictionary *json = [[NSMutableDictionary alloc] init];
      
      [json setObject:@"" forKey:@"action"];
      [json setObject:[oDTEFMobile getParameter:@"Comprovante"] forKey:@"Comprovante"];
      [json setObject:[oDTEFMobile getParameter:@"NSU"] forKey:@"NSU"];
      [json setObject:[oDTEFMobile getParameter:@"CodigoRede"] forKey:@"CodigoRede"];
      [json setObject:[oDTEFMobile getParameter:@"CodigoBandeira"] forKey:@"CodigoBandeira"];
      [json setObject:[oDTEFMobile getParameter:@"IndiceCodigoBandeira"] forKey:@"IndiceCodigoBandeira"];
      [json setObject:[oDTEFMobile getParameter:@"IndiceCodigoRede"] forKey:@"IndiceCodigoRede"];
      [json setObject:[oDTEFMobile getParameter:@"TipoOperacao"] forKey:@"TipoOperacao"];
      [json setObject:[oDTEFMobile getParameter:@"ComprovanteCliente"] forKey:@"ComprovanteCliente"];
      [json setObject:[oDTEFMobile getParameter:@"ComprovanteEstabelecimento"] forKey:@"ComprovanteEstabelecimento"];
      [json setObject:[oDTEFMobile getParameter:@"ComprovanteReduzido"] forKey:@"ComprovanteReduzido"];
      [json setObject:[oDTEFMobile getParameter:@"NSURede"] forKey:@"NSURede"];
      [json setObject:[oDTEFMobile getParameter:@"CodigoResposta"] forKey:@"CodigoResposta"];
      [json setObject:[oDTEFMobile getParameter:@"CodigoAutorizacao"] forKey:@"CodigoAutorizacao"];
      [json setObject:[oDTEFMobile getParameter:@"NumeroParcelas"] forKey:@"NumeroParcelas"];
      [json setObject:[oDTEFMobile getParameter:@"NomeBandeira"] forKey:@"NomeBandeira"];
      [json setObject:[oDTEFMobile getParameter:@"NumeroCartao"] forKey:@"NumeroCartao"];
      [json setObject:[oDTEFMobile getParameter:@"TipoFinanciamento"] forKey:@"TipoFinanciamento"];
      [json setObject:[oDTEFMobile getParameter:@"DataFiscal"] forKey:@"DataFiscal"];
      [json setObject:[oDTEFMobile getParameter:@"HoraFiscal"] forKey:@"HoraFiscal"];
      [json setObject:[oDTEFMobile getParameter:@"CNPJRede"] forKey:@"CNPJRede"];
      [json setObject:[oDTEFMobile getParameter:@"ValorDesconto"] forKey:@"ValorDesconto"];
      [json setObject:[oDTEFMobile getParameter:@"ValorPago"] forKey:@"ValorPago"];
      [json setObject:[oDTEFMobile getParameter:@"NUMPDV"] forKey:@"NUMPDV"];
      [json setObject:[oDTEFMobile getParameter:@"NUMLOJA"] forKey:@"NUMLOJA"];
      [json setObject:[oDTEFMobile getParameter:@"NUMESTAB"] forKey:@"NUMESTAB"];
      [json setObject:[oDTEFMobile getParameter:@"NumeroPDV"] forKey:@"NumeroPDV"];
      [json setObject:[oDTEFMobile getParameter:@"NumeroLoja"] forKey:@"NumeroLoja"];
      [json setObject:[oDTEFMobile getParameter:@"NumeroEmpresa"] forKey:@"NumeroEmpresa"];
      [self sendResult:@"" json:json];
    }
    else
    {
      NSLog(@"executeTransactionX resultado != 0");
      NSMutableDictionary *json = [[NSMutableDictionary alloc] init];
      
      [json setObject:@"" forKey:@"action"];
      [json setObject:[oDTEFMobile getParameter:@"MensagemErro"] forKey:@"MensagemErro"];
      [self sendResultError: json];
    }
    NSLog(@"Depois executeTransactionX 2");
    
  }];
}


- (void) executaTransacaoEspecial: (int) iCodigoTransacao parameters:(NSString *) parameters
{
  [self.commandDelegate runInBackground:^{
    oDTEFMobile = [[CDTEFMobile alloc] init];
    
    if (![parameters isEqualToString:@""])
    {
      [self defineParametrosDTEFMobile:oDTEFMobile parameters:parameters];
    }
    
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setValue:[self valorParametro:parameters parametro:@"TransacaoEspecialDadosEntrada"] forKey:@"TransacaoEspecialDadosEntrada"];

    NSLog(@"Antes executeTransactionSpecial");
    int iResultado;
    
    if (iCodigoTransacao >= 0)
      iResultado = [oDTEFMobile executeTransactionSpecial:iCodigoTransacao view:self];
    else
      iResultado = 11;
    NSLog(@"Depois executeTransactionSpecial resultado=%d", iResultado);
    
    if (iResultado == 0)
    {
      NSMutableDictionary *json = [[NSMutableDictionary alloc] init];
      
      [json setObject:@"" forKey:@"action"];
      [json setObject:[oDTEFMobile getParameter:@"TransacaoEspecialDadosSaida"] forKey:@"TransacaoEspecialDadosSaida"];
      [self sendResult:@"" json:json];
    }
    else
    {
      NSMutableDictionary *json = [[NSMutableDictionary alloc] init];
      
      [json setObject:@"" forKey:@"action"];
      [json setObject:[oDTEFMobile getParameter:@"MensagemErro"] forKey:@"MensagemErro"];
      [self sendResultError: json];
    }
    
  }];
}

- (NSMutableDictionary *) criaJSONFuncao:(NSString *) nomeFuncao
{
  NSLog(@"criaJSONFuncao: %@", nomeFuncao);
  NSMutableDictionary *results = [[NSMutableDictionary alloc] init];
  [results setObject:@"InputCallback" forKey:@"action"];
  [results setObject:nomeFuncao forKey:@"function"];
  return results;
}

- (void) sendResult: (NSString *) nomeFuncao json: (NSDictionary *) json
{
  [self setRespostaRecebida:false];
  CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:json];
  [pluginResult setKeepCallbackAsBool:YES];
  [self.commandDelegate sendPluginResult:pluginResult callbackId:callbackId];
  NSLog(@"sendResult: %@ json:%@", nomeFuncao, json);
}

- (void) sendResultError: (NSDictionary *) json
{
  [self setRespostaRecebida:false];
  CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:json];
  [pluginResult setKeepCallbackAsBool:YES];
  [self.commandDelegate sendPluginResult:pluginResult callbackId:callbackId];
}

- (CRetorno *) aguardaRecebeResposta: (NSString *) nomeFuncao
{
  NSLog(@"aguardaRecebeResposta - %@ inicio bRespostaRecebida = %d", nomeFuncao, bRespostaRecebida);
  while (!bRespostaRecebida)
  {
    NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
    bool bTerminado = false;
    while (!bTerminado &&
    [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil])
    {
      loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
      bTerminado = true;
    }
  }

  CRetorno *oRetorno = [[CRetorno alloc] init];
  [oRetorno setResultado: [oRetornoRespostaRecebida getResultado]];
  [oRetorno setStringRetorno: [oRetornoRespostaRecebida getStringRetorno]];
  [oRetorno setIntRetorno: [oRetornoRespostaRecebida getIntRetorno]];
  
  NSLog(@"aguardaRecebeResposta = resultado = %d", [oRetorno getResultado]);
  NSLog(@"aguardaRecebeResposta = stringRetorno = %@", [oRetorno getStringRetorno]);
  NSLog(@"aguardaRecebeResposta = intRetorno = %d", [oRetorno getIntRetorno]);
  
  return oRetorno;
}

- (void) beep
{
  NSString *funcao = @"beep";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];

  [self sendResult:funcao json:json];
  [self aguardaRecebeResposta: funcao];
}

- (void) limpaDisplayTerminal
{
  NSString *funcao = @"limpaDisplayTerminal";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];

  [self sendResult:funcao json:json];
  [self aguardaRecebeResposta: funcao];
}

- (void) displayTerminal:(NSString *) mensagem
{
  NSString *funcao = @"displayTerminal";

  NSMutableDictionary *json = [self criaJSONFuncao: funcao];
  if (mensagem != nil)
  [json setObject:mensagem forKey:@"mensagem"];

  [self sendResult:funcao json:json];
  [self aguardaRecebeResposta: funcao];
}

- (void) displayErro:(NSString *) mensagem
{
  NSString *funcao = @"displayErro";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];

  if (mensagem != nil)
  [json setObject:mensagem forKey:@"mensagem"];
  [self sendResult:funcao json:json];
  [self aguardaRecebeResposta: funcao];
}

- (void) mensagem:(NSString *) mensagem
{
  NSString *funcao = @"mensagem";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];

  if (mensagem != nil)
  [json setObject:mensagem forKey:@"mensagem"];
  [self sendResult:funcao json:json];
  [self aguardaRecebeResposta: funcao];
}

- (int) solicitaConfirmacao:(NSString *) mensagem
{
  NSString *funcao = @"solicitaConfirmacao";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];

  if (mensagem != nil)
  [json setObject:mensagem forKey:@"mensagem"];
  [self sendResult:funcao json:json];
  CRetorno *oRetorno = [self aguardaRecebeResposta: funcao];
  return [oRetorno getResultado];
}

- (void) mensagemAlerta:(NSString *) mensagem
{
  NSString *funcao = @"mensagemAlerta";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];

  if (mensagem != nil)
  [json setObject:mensagem forKey:@"mensagem"];
  [self sendResult:funcao json:json];
  [self aguardaRecebeResposta: funcao];
}

- (CRetorno *) entraCartao:(NSString *) label numeroCartao:(NSString *) numeroCartao // número do cartão na string de retorno
{
  NSString *funcao = @"entraCartao";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];
  
  [json setObject:label forKey:@"label"];
  [json setObject:numeroCartao forKey:@"numeroCartao"];
  [self sendResult:funcao json:json];
  return [self aguardaRecebeResposta: funcao];
}

- (CRetorno *) entraDataValidade:(NSString *) label dataValidade:(NSString *) dataValidade // data de validade na string de retorno
{
  NSString *funcao = @"entraDataValidade";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];
  
  [json setObject:label forKey:@"label"];
  [json setObject:dataValidade forKey:@"dataValidade"];
  [self sendResult:funcao json:json];
  return [self aguardaRecebeResposta: funcao];
}

- (CRetorno *) entraData:(NSString *) label data:(NSString *) data // data na string de retorno
{
  NSString *funcao = @"entraData";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];
  
  [json setObject:label forKey:@"label"];
  [json setObject:data forKey:@"data"];
  [self sendResult:funcao json:json];
  return [self aguardaRecebeResposta: funcao];
}

- (CRetorno *) entraCodigoSeguranca:(NSString *) label codigoSeguranca:(NSString *) codigoSeguranca tamanhoMax:(int) tamanhoMax // código de segurança na string de retorno
{
  NSString *funcao = @"entraCodigoSeguranca";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];
  
  [json setObject:label forKey:@"label"];
  [json setObject:codigoSeguranca forKey:@"codigoSeguranca"];
  [json setObject:[NSString stringWithFormat:@"%d", tamanhoMax] forKey:@"tamanhoMax"];
  [self sendResult:funcao json:json];
  return [self aguardaRecebeResposta: funcao];
}

- (CRetorno *) selecionaOpcao:(NSString *)label opcoes:(NSString *)opcoes opcaoSelecionada:(int) opcao; // número da opção selecionada no inteiro de retorno
{
  NSString *funcao = @"selecionaOpcao";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];
  
  [json setObject:label forKey:@"label"];
  [json setObject:opcoes forKey:@"opcoes"];
  [json setObject:[NSString stringWithFormat:@"%d", opcao] forKey:@"opcao"];
  [self sendResult:funcao json:json];
  return [self aguardaRecebeResposta: funcao];
}

- (CRetorno *) selecionaOpcaoEx:(NSString *)label opcoes:(NSString *)opcoes opcaoSelecionada:(int) opcao identificadorSelecionado:(NSString *)identificador // número da opção selecionada no inteiro de retorno e identificador da opção na string de retorno
{
  NSString *funcao = @"selecionaOpcaoEx";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];
  
  [json setObject:label forKey:@"label"];
  [json setObject:opcoes forKey:@"opcoes"];
  [json setObject:[NSString stringWithFormat:@"%d", opcao] forKey:@"opcaoSelecionada"];
  [json setObject:identificador forKey:@"identificador"];
  [self sendResult:funcao json:json];
  return [self aguardaRecebeResposta: funcao];
}

- (CRetorno *) entraValor:(NSString *)label valor:(NSString *) valor valorMinimo:(NSString *) valorMinimo valorMaximo:(NSString *) valorMaximo // valor na string de retorno
{
  NSString *funcao = @"entraValor";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];
  
  [json setObject:label forKey:@"label"];
  [json setObject:valor forKey:@"valor"];
  [json setObject:valorMinimo forKey:@"valorMinimo"];
  [json setObject:valorMaximo forKey:@"valorMaximo"];
  [self sendResult:funcao json:json];
  return [self aguardaRecebeResposta: funcao];
}

- (CRetorno *) entraNumero:(NSString *) label numeroRetorno:(NSString *) numero numeroMinimo:(NSString *) numeroMinimo numeroMaximo:(NSString *) numeroMaximo minimoDigitos:(int) iMinimoDigitos maximoDigitos:(int) iMaximoDigitos digitosExatos:(int) iDigitosExatos // número na string de retorno
{
  NSString *funcao = @"entraNumero";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];
  
  [json setObject:label forKey:@"label"];
  [json setObject:numero forKey:@"numero"];
  if (numeroMinimo == nil)
  [json setObject:@"00" forKey:@"numeroMinimo"];
  else
  [json setObject:numeroMinimo forKey:@"numeroMinimo"];
  [json setObject:numeroMaximo forKey:@"numeroMaximo"];
  [json setObject:[NSString stringWithFormat:@"%d", iMinimoDigitos] forKey:@"minimoDigitos"];
  [json setObject:[NSString stringWithFormat:@"%d", iMaximoDigitos] forKey:@"maximoDigitos"];
  [json setObject:[NSString stringWithFormat:@"%d", iDigitosExatos] forKey:@"digitosExatos"];
  [self sendResult:funcao json:json];
  return [self aguardaRecebeResposta: funcao];
}

- (CRetorno *) entraString:(NSString *)label limpaBuffer:(int) limpaBuffer stringEntrada:(NSString *) stringEntrada minimoDigitos:(int) minimo maximoDigitos:(int) maximo coletaSecreta:(int) secreta // dados na string de retorno
{
  NSString *funcao = @"entraString";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];
  
  [json setObject:label forKey:@"label"];
  [json setObject:[NSString stringWithFormat:@"%d", limpaBuffer] forKey:@"limpaBuffer"];
  [json setObject:stringEntrada forKey:@"stringEntrada"];
  [json setObject:[NSString stringWithFormat:@"%d", minimo] forKey:@"minimoDigitos"];
  [json setObject:[NSString stringWithFormat:@"%d", maximo] forKey:@"maximoDigitos"];
  [json setObject:[NSString stringWithFormat:@"%d", secreta] forKey:@"coletaSecreta"];
  [self sendResult:funcao json:json];
  return [self aguardaRecebeResposta: funcao];
}

- (CRetorno *) entraMascara:(bool) bLimpaTela colLabel:(int) colLabel linLabel:(int) linLabel linColeta:(int) linColeta limpaBuffer:(bool) limpaBuffer label:(NSString *) label mascara:(NSString *) mascara stringEntrada:(NSString *) stringEntrada permiteEntra:(bool) permiteEntra // dados na string de retorno
{
  NSString *funcao = @"entraMascara";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];
  
  [json setObject:[NSString stringWithFormat:@"%d", bLimpaTela] forKey:@"bLimpaTela"];
  [json setObject:[NSString stringWithFormat:@"%d", colLabel] forKey:@"colLabel"];
  [json setObject:[NSString stringWithFormat:@"%d", linLabel] forKey:@"linLabel"];
  [json setObject:[NSString stringWithFormat:@"%d", linColeta] forKey:@"linColeta"];
  [json setObject:[NSString stringWithFormat:@"%d", limpaBuffer] forKey:@"limpaBuffer"];
  [json setObject:label forKey:@"label"];
  [json setObject:mascara forKey:@"mascara"];
  [json setObject:stringEntrada forKey:@"stringEntrada"];
  [json setObject:[NSString stringWithFormat:@"%d", permiteEntra] forKey:@"permiteEntra"];
  [self sendResult:funcao json:json];
  return [self aguardaRecebeResposta: funcao];
}

- (int) operacaoCancelada
{
//  return 0;
  
  // pendentej-testes
  NSString *funcao = @"operacaoCancelada";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];
  
  [self sendResult:funcao json:json];
  CRetorno *oRetorno = [self aguardaRecebeResposta: funcao];
  return [oRetorno getResultado];
}

- (int) setaOperacaoCancelada:(bool) cancelada
{
  NSString *funcao = @"setaOperacaoCancelada";
  NSMutableDictionary *json = [self criaJSONFuncao: funcao];
  
  [json setObject:[NSString stringWithFormat:@"%d", cancelada] forKey:@"cancelada"];
  [self sendResult:funcao json:json];
  CRetorno *oRetorno = [self aguardaRecebeResposta: funcao];
  return [oRetorno getResultado];
}

@end
