package cordova.plugin.netcontroll.integration;

import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaWebView;


import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.graphics.Bitmap;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
import android.net.Uri;
import android.content.Intent;
import android.provider.MediaStore;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;

import android.util.Base64;


import br.com.setis.safra.integracaosafra.BuildConfig;
import br.com.setis.safra.integracaosafra.Gerenciador;
import br.com.setis.safra.integracaosafra.PrinterIntegracao;
import br.com.setis.safra.integracaosafra.entidades.DadosAutomacao;
import br.com.setis.safra.integracaosafra.entidades.EntradaTransacao;
import br.com.setis.safra.integracaosafra.entidades.MifareBlockData;
import br.com.setis.safra.integracaosafra.entidades.NFCRequest;
import br.com.setis.safra.integracaosafra.entidades.Operacoes;
import br.com.setis.safra.integracaosafra.entidades.RequestApi;
import br.com.setis.safra.integracaosafra.entidades.SaidaTransacao;
import br.com.setis.safra.integracaosafra.listeners.MifareNFCCallback;
import br.com.setis.safra.integracaosafra.listeners.PrinterListener;
import br.com.setis.safra.integracaosafra.listeners.TransacaoListenerCallback;
import br.com.setis.safra.integracaosafra.printer.PrinterStatus;
import br.com.setis.safra.integracaosafra.printer.PrinterTextAlignment;
import br.com.setis.safra.integracaosafra.printer.PrinterTextSize;
import br.com.setis.safra.integracaosafra.printer.PrinterTextStyle;
import br.com.setis.safra.integracaosafra.util.ReturnCodes;


//Json Serialize
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;
import com.google.zxing.WriterException;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.BarcodeFormat;

import java.util.List;
import java.util.HashMap;
import java.util.Map;

import com.google.zxing.EncodeHintType;

import android.os.AsyncTask;

import androidx.annotation.NonNull;

import java.lang.reflect.Type;
import java.util.ArrayList;

import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.util.EnumMap;

import com.izettle.html2bitmap.Html2Bitmap;
import com.izettle.html2bitmap.content.WebViewContent;

import java.io.ByteArrayOutputStream;

public class SafraPayIngenico {
    private Gerenciador gerenciadorIntegracaoSafra;


    private Activity mActivity;
    private Context mContext;
    private CordovaInterface mCordova;
    private CordovaWebView webView;
    private final TransacaoListenerCallback callbackTransacaoIntegracao = new TransacaoListenerCallback() {
        @Override
        public void transacaoFinalizada(final SaidaTransacao saidaTransacao) {
            // Log.d(TAG, "processaSaidaTransacao! callback recebido");

            // final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            // LinearLayout dialogLayout = (LinearLayout) getLayoutInflater().inflate(R.layout.dialog_transacao, null);
            // TextView comprovante = (TextView) dialogLayout.findViewById(R.id.comprovante);

            //1 = aprovada // 3 = estornada
            if (saidaTransacao.obtemResultadoTransacao() == ReturnCodes.RESULT_APROVADA ||
                    (saidaTransacao.obtemOperacaoRealizada() == Operacoes.CANCELAMENTO ||
                            saidaTransacao.obtemOperacaoRealizada() == Operacoes.CANCELAMENTO_VIA_NSU &&
                                    saidaTransacao.obtemResultadoTransacao() == ReturnCodes.RESULT_ESTORNADA)) {
                // comprovante.setText(saidaTransacao.obtemComprovanteViaLojista().toString());
                // builder.setView(dialogLayout);
            } else if (saidaTransacao.obtemOperacaoRealizada() == Operacoes.REIMPRESSAO &&
                    saidaTransacao.obtemResultadoTransacao() == ReturnCodes.RESULT_OK) {
                // builder.setMessage("Sucesso " + saidaTransacao.obtemOperacaoRealizada().name());
            } else {
                // builder.setMessage("erro ao realizar " + saidaTransacao.obtemOperacaoRealizada().name());
            }

            // Dialog dialogComprovante = builder.create();
            // dialogComprovante.show();
        }

        @Override
        public void transacaoException(Exception e) {
            // Log.e(TAG, "transacaoException: ", e);
        }
    };


    //@Override
    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
        mActivity = cordova.getActivity();
        mContext = cordova.getActivity().getApplicationContext();
        mCordova = cordova;
        DadosAutomacao dadosAutomacao = new DadosAutomacao("Empresa", "Automacao", "1.0");
        gerenciadorIntegracaoSafra = new Gerenciador(cordova.getActivity(), dadosAutomacao);
    }

    public String Teste() {
        return "Result - SafraPayIngenico: ok";
    }

    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if (action.equals("IniciarTransacao")) {
            try {
                JSONObject params = args.getJSONObject(0);

                String tipoTransacao = params.getString("tipoTransacao");
                Operacoes tipoTransacaoObj = GetOperacaoTypeEnumByName(tipoTransacao);

                int valor = params.getInt("valor");
                int numeroParcelas = params.getInt("numeroParcelas");

                String identificadorAutomacao = params.getString("identificadorAutomacao");

                EntradaTransacao entradaTransacao = new EntradaTransacao(valor, tipoTransacaoObj, numeroParcelas, identificadorAutomacao);
                RequestApi requestApi = new RequestApi(entradaTransacao);

                TransacaoListenerCallback callbackIniciarTransacao = new TransacaoListenerCallback() {
                    @Override
                    public void transacaoFinalizada(final SaidaTransacao saidaTransacao) {
                        String teste = "";
                        // Log.d(TAG, "processaSaidaTransacao! callback recebido");

                        // final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                        // LinearLayout dialogLayout = (LinearLayout) getLayoutInflater().inflate(R.layout.dialog_transacao, null);
                        // TextView comprovante = (TextView) dialogLayout.findViewById(R.id.comprovante);

                        //1 = aprovada // 3 = estornada
                        if (saidaTransacao.obtemResultadoTransacao() == ReturnCodes.RESULT_APROVADA || (saidaTransacao.obtemOperacaoRealizada() == Operacoes.CANCELAMENTO || saidaTransacao.obtemOperacaoRealizada() == Operacoes.CANCELAMENTO_VIA_NSU && saidaTransacao.obtemResultadoTransacao() == ReturnCodes.RESULT_ESTORNADA)) {
                            String viaImpressao = saidaTransacao.obtemComprovanteViaLojista().toString();
                            callbackContext.success(cordova.plugin.netcontroll.integration.util.NetControllHelpers.parseObjToJsonSrtring(saidaTransacao));
                        } else if (saidaTransacao.obtemOperacaoRealizada() == Operacoes.REIMPRESSAO && saidaTransacao.obtemResultadoTransacao() == ReturnCodes.RESULT_OK) {
                            callbackContext.success(cordova.plugin.netcontroll.integration.util.NetControllHelpers.parseObjToJsonSrtring(saidaTransacao));
                            // builder.setMessage("Sucesso " + saidaTransacao.obtemOperacaoRealizada().name());
                        } else {
                            // callbackContext.error("erro ao realizar " + saidaTransacao.obtemOperacaoRealizada().name());
                            callbackContext.error("Erro ao realizar: " + saidaTransacao.obtemOperacaoRealizada().name() + "\n" + ParseReturnCodeString(saidaTransacao.obtemResultadoTransacao()));
                        }
                    }

                    @Override
                    public void transacaoException(Exception e) {
                        callbackContext.error("erro " + e.toString());
                    }
                };
                gerenciadorIntegracaoSafra.realizaTransacao(requestApi, callbackIniciarTransacao);
                return true;
            } catch (Exception e) {
                callbackContext.error("IniciarTransacao error: " + e.toString());
            }
            return false;
        } else if (action.equals("CancelarTransacao")) {
            try {
                JSONObject params = args.getJSONObject(0);

                String tipoTransacao = params.getString("tipoTransacao");
                Operacoes tipoTransacaoObj = GetOperacaoTypeEnumByName(tipoTransacao);

                String nsuTransacao = params.getString("nsuTransacao");

                String identificadorAutomacao = params.getString("identificadorAutomacao");

                EntradaTransacao entradaTransacaoCancelamento = new EntradaTransacao(nsuTransacao, tipoTransacaoObj, identificadorAutomacao);
                RequestApi requestApi = new RequestApi(entradaTransacaoCancelamento);

                TransacaoListenerCallback callbackCancelamentoTransacao = new TransacaoListenerCallback() {
                    @Override
                    public void transacaoFinalizada(final SaidaTransacao saidaTransacao) {
                        //1 = aprovada // 3 = estornada
                        if (saidaTransacao.obtemResultadoTransacao() == ReturnCodes.RESULT_APROVADA || (saidaTransacao.obtemOperacaoRealizada() == Operacoes.CANCELAMENTO || saidaTransacao.obtemOperacaoRealizada() == Operacoes.CANCELAMENTO_VIA_NSU && saidaTransacao.obtemResultadoTransacao() == ReturnCodes.RESULT_ESTORNADA)) {
                            String viaImpressao = saidaTransacao.obtemComprovanteViaLojista().toString();
                            callbackContext.success(cordova.plugin.netcontroll.integration.util.NetControllHelpers.parseObjToJsonSrtring(saidaTransacao));
                        } else if (saidaTransacao.obtemOperacaoRealizada() == Operacoes.REIMPRESSAO && saidaTransacao.obtemResultadoTransacao() == ReturnCodes.RESULT_OK) {
                            callbackContext.success(cordova.plugin.netcontroll.integration.util.NetControllHelpers.parseObjToJsonSrtring(saidaTransacao));
                            // builder.setMessage("Sucesso " + saidaTransacao.obtemOperacaoRealizada().name());
                        } else {
                            callbackContext.error("erro ao realizar " + saidaTransacao.obtemOperacaoRealizada().name());
                        }
                    }

                    @Override
                    public void transacaoException(Exception e) {
                        callbackContext.error("erro " + e.toString());
                    }
                };
                gerenciadorIntegracaoSafra.realizaTransacao(requestApi, callbackCancelamentoTransacao);
                return true;
            } catch (Exception e) {
                callbackContext.error("IniciarTransacao error: " + e.toString());
            }
            return false;
        } else if (action.equals("ImpressaoTextoNetPrint")) {
            JSONObject params = args.getJSONObject(0);
            try {
                String dados = params.getString("dados");
                Boolean negrito = false;
                try {
                    negrito = params.getBoolean("negrito");
                } catch (Exception ex) {
                }
                String html = cordova.plugin.netcontroll.integration.util.NetControllPrinter.ConverterTextoImpressoToHtml(dados, negrito);
                cordova.plugin.netcontroll.integration.util.NetControllPrinter.ConverterHtmlToBitmap(html, mContext, bitmapResult -> {
                    try {
                        PrinterIntegracao printerIntegracaoImg = gerenciadorIntegracaoSafra.getPrinterIntegracao();
                        printerIntegracaoImg.addBitmap(bitmapResult, PrinterTextAlignment.LEFT);
                        printerIntegracaoImg.print(new PrinterListener() {
                            @Override
                            public void eventoSaida(PrinterStatus printerStatus) {
                                if (printerStatus == PrinterStatus.ERROR_NO_PAPER) {
                                    callbackContext.error("Impressora sem papel");

                                } else {
                                    callbackContext.success("Impressão - OK");
                                }
                            }

                            @Override
                            public void eventoException(Exception e) {
                                callbackContext.error("ImpressaoTextoNetPrint error: " + e.toString());
                            }
                        }, 500);
                    } catch (Exception errorPost) {
                        callbackContext.error("Result - ConverterHtmlToBitmap: " + "Error Detail: " + errorPost);
                    }
                });
            } catch (Exception e) {
                callbackContext.error("ImpressaoTextoNetPrintImg error: " + e);
            }
            return true;
        } else if (action.equals("ImpressaoBase64NetPrint")) {
            try {
                JSONObject params = args.getJSONObject(0);
                String base64String = params.getString("base64String");

                Bitmap dadosImg = cordova.plugin.netcontroll.integration.util.NetControllPrinter.ConverterBase64ToBitmap(base64String);
                try {
                    PrinterIntegracao printerIntegracaoImg = gerenciadorIntegracaoSafra.getPrinterIntegracao();
                    printerIntegracaoImg.addBitmap(dadosImg, PrinterTextAlignment.LEFT);
                    printerIntegracaoImg.print(new PrinterListener() {
                        @Override
                        public void eventoSaida(PrinterStatus printerStatus) {
                            if (printerStatus == PrinterStatus.ERROR_NO_PAPER) {
                                callbackContext.error("Impressora sem papel");

                            } else {
                                callbackContext.success("Impressão - OK");
                            }
                        }

                        @Override
                        public void eventoException(Exception e) {
                            callbackContext.error("ImpressaoTextoNetPrint error: " + e.toString());
                        }
                    }, 500);
                } catch (Exception errorPost) {
                    callbackContext.error("Result - ConverterHtmlToBitmap: " + "Error Detail: " + errorPost);
                }
            } catch (Exception e) {
                callbackContext.error("PrintTesteBase64 error: " + e.toString());
            }
            return true;
        }
        return false;
    }

    private void enviaTransacao(final RequestApi requestApi) {
        gerenciadorIntegracaoSafra.realizaTransacao(requestApi, callbackTransacaoIntegracao);
    }

    private Operacoes GetOperacaoTypeEnumByName(String operacaoTypeName) {
        Operacoes operacao = Operacoes.NONE;
        switch (operacaoTypeName) {
            case "VENDA_DEBITO":
                operacao = Operacoes.VENDA_DEBITO;
                break;
            case "VENDA_DEBITO_A_VISTA":
                operacao = Operacoes.VENDA_DEBITO_A_VISTA;
                break;
            case "VENDA_DEBITO_FATURA":
                operacao = Operacoes.VENDA_DEBITO_FATURA;
                break;
            case "VENDA_CREDITO":
                operacao = Operacoes.VENDA_CREDITO;
                break;
            case "VENDA_CREDITO_A_VISTA":
                operacao = Operacoes.VENDA_CREDITO_A_VISTA;
                break;
            case "VENDA_CREDITO_PARC_SEM_JUROS":
                operacao = Operacoes.VENDA_CREDITO_PARC_SEM_JUROS;
                break;
            case "VENDA_CREDITO_PARC_COM_JUROS":
                operacao = Operacoes.VENDA_CREDITO_PARC_COM_JUROS;
                break;
            case "VENDA_VOUCHER":
                operacao = Operacoes.VENDA_VOUCHER;
                break;
            case "PIX":
                operacao = Operacoes.VENDA_PIX;
                break;
            case "VENDA_QRCODE":
                operacao = Operacoes.VENDA_QRCODE;
                break;
            case "PRE_AUTORIZACAO":
                operacao = Operacoes.PRE_AUTORIZACAO;
                break;
            case "PRE_AUTORIZACAO_SOLICITA":
                operacao = Operacoes.PRE_AUTORIZACAO_SOLICITA;
                break;
            case "PRE_AUTORIZACAO_CONFIRM":
                operacao = Operacoes.PRE_AUTORIZACAO_CONFIRM;
                break;
            case "PRE_AUTORIZACAO_CANCEL":
                operacao = Operacoes.PRE_AUTORIZACAO_CANCEL;
                break;
            case "CANCELAMENTO":
                operacao = Operacoes.CANCELAMENTO;
                break;
            case "CANCELAMENTO_VIA_NSU":
                operacao = Operacoes.CANCELAMENTO_VIA_NSU;
                break;
            case "DEVOLUCAO_PIX":
                operacao = Operacoes.DEVOLUCAO_PIX;
                break;
            case "OUTROS":
                operacao = Operacoes.OUTROS;
                break;
            case "REIMPRESSAO":
                operacao = Operacoes.REIMPRESSAO;
                break;
            case "NONE":
                operacao = Operacoes.NONE;
                break;
        }
        return operacao;
    }

      private String ParseReturnCodeString(int codeValue) {
        String result = String.valueOf(codeValue);
        switch (codeValue) {
            case 0:
                result = "RESULT_OK";
                break;
            case 1:
                result = "RESULT_APROVADA";
                break;
            case 3:
                result = "RESULT_ESTORNADA";
                break;
            case -82:
                result = "HW_HWERR";
                break;
            case -200:
                result = "POS_MAXERR";
                break;
            case -205:
                result = "POS_HWERR";
                break;
            case -206:
                result = "POS_PRERR";
                break;
            case -207:
                result = "POS_PRERRVOLT";
                break;
            case -208:
                result = "POS_NOPAPER";
                break;
            case -209:
                result = "POS_TIMEOUT";
                break;
            case -210:
                result = "POS_CANCEL";
                break;
            case -2000:
                result = "BSFERR_MAX";
                break;
            case -2001:
                result = "BSFERR_4DIGITOS";
                break;
            case -2002:
                result = "BSFERR_CARTAO_INVALIDO";
                break;
            case -2003:
                result = "BSFERR_PAN_INVALIDO";
                break;
            case -2004:
                result = "BSFERR_MODO_INV_PRE";
                break;
            case -2005:
                result = "BSFERR_USE_CHIP";
                break;
            case -2006:
                result = "BSFERR_SENHA_INVALIDA";
                break;
            case -2007:
                result = "BSFERR_ERRO_LEITURA";
                break;
            case -2008:
                result = "BSFERR_SEM_REIMPRESSAO";
                break;
            case -2009:
                result = "BSFERR_CARTAO_BLOQUEADO";
                break;
            case -2010:
                result = "BSFERR_TERMNAOHAB";
                break;
            case -2011:
                result = "BSFERR_TERMBLOQ";
                break;
            case -2012:
                result = "BSFERR_TERMCANC";
                break;
            case -2013:
                result = "BSFERR_SEM_PRODUTO";
                break;
            case -2014:
                result = "BSFERR_SENHA_SEQUENCIAL";
                break;
            case -2015:
                result = "BSFERR_SENHA_NUM_REPETIDOS";
                break;
            case -2016:
                result = "BSFERR_SENHA_NAO_CONFERE";
                break;
            case -2017:
                result = "BSFERR_RELAT_INDISP";
                break;
            case -2018:
                result = "BSFERR_PROIBIDO_DIGITADA";
                break;
            case -2019:
                result = "BSFERR_ERRO_PEDIDO_BOB";
                break;
            case -2020:
                result = "BSFERR_EXCEDE_PARCELAS";
                break;
            case -2021:
                result = "BSFERR_ERRO_ESTATISTICA";
                break;
            case -2022:
                result = "BSFERR_CNPJ_CPFINV";
                break;
            case -2023:
                result = "BSFERR_CNPJ_CPF_NAO_CONF";
                break;
            case -2024:
                result = "BSFERR_CEP_NAO_CONF";
                break;
            case -2025:
                result = "BSFERR_CARTAO_VENCIDO";
                break;
            case -2026:
                result = "BSFERR_CANCEL_NAO_PERM";
                break;
            case -2027:
                result = "BSFERR_CANCEL_NAO_AUT";
                break;
            case -2028:
                result = "BSFERR_BAIXA_OS_NAO_AUT";
                break;
            case -2029:
                result = "BSFERR_NAO_INICIALIZADO";
                break;
            case -2030:
                result = "BSFERR_NAO_CONFIGURADO";
                break;
            case -2031:
                result = "BSFERR_ERRO_PINPAD";
                break;
            case -2032:
                result = "BSFERR_SEM_TELECARGA";
                break;
            case -2033:
                result = "BSFERR_TELECARGA_ARQUIVO";
                break;
            case -2034:
                result = "BSFERR_TELECARGA_INSTALA";
                break;
            case -2035:
                result = "BSFERR_ERRO_INTERNO";
                break;
            case -2036:
                result = "BSFERR_ERRO_PARAM";
                break;
            case -2037:
                result = "BSFERR_SEM_RESPOSTA";
                break;
            case -2038:
                result = "BSFERR_ERRO_COM";
                break;
            case -2039:
                result = "BSFERR_MSG_INVALIDA";
                break;
            case -2040:
                result = "BSFERR_SEM_TOM_DISC";
                break;
            case -2041:
                result = "BSFERR_LINHA_OCUPADA";
                break;
            case -2042:
                result = "BSFERR_QUEDA_LINHA";
                break;
            case -2043:
                result = "BSFERR_NAO_ATENDE";
                break;
            case -2044:
                result = "BSFERR_FALHA_PPP";
                break;
            case -2045:
                result = "BSFERR_ERRO_SOCKET";
                break;
            case -2046:
                result = "BSFERR_SIM_BLOQUEADO";
                break;
            case -2047:
                result = "BSFERR_SEM_SIM";
                break;
            case -2048:
                result = "BSFERR_ERRO_SIM";
                break;
            case -2049:
                result = "BSFERR_ERRO_ATACH";
                break;
            case -2050:
                result = "BSFERR_ERRO_DADOS";
                break;
            case -2051:
                result = "BSFERR_ERRO_GSM";
                break;
            case -2052:
                result = "BSFERR_MESMA_VERSAO";
                break;
            case -2053:
                result = "BSFERR_SEM_ETHERNET";
                break;
            case -2054:
                result = "BSFERR_SEM_WIFI";
                break;
            case -2055:
                result = "BSFERR_CONFIG_CELULAR";
                break;
            case -2056:
                result = "BSFERR_CONFIG_WIFI";
                break;
            case -2057:
                result = "BSFERR_RDS7_SRV_UNK";
                break;
            case -2058:
                result = "BSFERR_RDS7_SRV_TAGN";
                break;
            case -2059:
                result = "BSFERR_RDS7_SRV_TAGE";
                break;
            case -2060:
                result = "BSFERR_RDS7_SRV_ACQ";
                break;
            case -2061:
                result = "BSFERR_RDS7_SRV_VER";
                break;
            case -2062:
                result = "BSFERR_RDS7_SRV_MOD";
                break;
            case -2063:
                result = "BSFERR_RDS7_SRV_TRM";
                break;
            case -2064:
                result = "BSFERR_RDS7_SRV_NEW";
                break;
            case -2065:
                result = "BSFERR_ERRO_GENERICO";
                break;
            case -2066:
                result = "BSFERR_APLIC_NAO_PERM";
                break;
            case -2067:
                result = "BSFERR_ERRO_BIBLIOTECA_EMV";
                break;
            case -2068:
                result = "BSFERR_SEM_TRNS_CANCEL";
                break;
            case -2069:
                result = "BSFERR_PROBLEMA_ARQ";
                break;
            case -2070:
                result = "BSFERR_HABILITA_FALLBACK";
                break;
            case -2071:
                result = "BSFERR_INSIRA_O_CARTAO";
                break;
            case -2072:
                result = "BSFERR_CONTACTLESS";
                break;
            case -2073:
                result = "BSFERR_NEGADA_CARTAO";
                break;
            case -2074:
                result = "BSFERR_NEGADA_HOST";
                break;
            case -2075:
                result = "BSFERR_JA_CANC";
                break;
            case -2076:
                result = "BSFERR_OPER_NAO_PERMITIDA";
                break;
            case -2077:
                result = "BSFERR_TERM_HABILITADO";
                break;
            case -2078:
                result = "BSFERR_VALOR_INVALIDO";
                break;
            case -2079:
                result = "BSFERR_SEM_CHAVE";
                break;
            case -2080:
                result = "BSFERR_RETIRE_O_CARTAO";
                break;
            case -2081:
                result = "BSFERR_DATA_INVALIDA";
                break;
            case -2082:
                result = "BSFERR_NAO_MOSTRA_MSG";
                break;
            case -2083:
                result = "BSFERR_FC_INATIVA";
                break;
            case -2084:
                result = "BSFERR_ERRO_MEMORIA";
                break;
            case -2085:
                result = "BSFERR_SENHA_NCADASTR";
                break;
            case -2086:
                result = "BSFERR_CLESS_ODCVM";
                break;
            case -2087:
                result = "BSFERR_ATALHO_INVALIDO";
                break;
            case -2088:
                result = "BSFERR_INIC_PENDENTE";
                break;
            case -2089:
                result = "BSFERR_SEM_RELAT";
                break;
            case -2090:
                result = "BSFERR_CERTIF_SSL";
                break;
            case -2091:
                result = "BSFERR_DESFAZ_PENDENTE";
                break;
            case -2092:
                result = "BSFERR_REDE_WIFI";
                break;
            case -2093:
                result = "BSFERR_SEM_INTERNET";
                break;
            case -2094:
                result = "BSFERR_KIT_JA_IMPRESSO";
                break;
            case -2095:
                result = "BSFERR_CTLS_MULT_CARTOES";
                break;
            case -2096:
                result = "BSFERR_RDS7_SRV_BUSY";
                break;
            case -2097:
                result = "BSFERR_TERMNAOATIVO";
                break;
            case -2098:
                result = "BSFERR_ON_RECEIVE_DESFAZ";
                break;
            case -2112:
                result = "BSFERR_ERRO_ANTENA";
                break;
            case -2113:
                result = "BSFERR_DEMO_FUNC_INDISP";
                break;
            case -2114:
                result = "BSFERR_NOK_ARV";
                break;
            case -2115:
                result = "BSFERR_NOK_ATIVACAO";
                break;
            case -2116:
                result = "BSFERR_CARTAO_DIFERENTE";
                break;
            case -2117:
                result = "BSFERR_NUMCEL_DIFERENTE";
                break;
            case -2118:
                result = "BSFERR_VLR_EXCEDE_ORIG";
                break;
            case -2119:
                result = "BSFERR_INV_HOSTNAME";
                break;
            case -2120:
                result = "BSFERR_TEMPO_EXCEDIDO";
                break;
            case -2121:
                result = "BSFERR_PRE_CONFIGURADO";
                break;
            case -2122:
                result = "BSFERR_DECISAO_NAO_SENHA";
                break;
            case -2123:
                result = "BSFERR_CONTACTLESS_RETRY";
                break;
            case -2124:
                result = "BSFERR_ERRO_LEITURA_RETRY";
                break;
            case -2125:
                result = "BSFERR_EXCEDE_PARCELAS_TERM";
                break;
            case -2126:
                result = "BSFERR_SEM_CHAVE_DADOS";
                break;
            case -2127:
                result = "BSFERR_SEM_BATERIA_INSTALL";
                break;
            case -2128:
                result = "BSFERR_CELULAR_PPP_RETRY";
                break;
            case -2200:
                result = "BSFERR_NOK_RECARGA";
                break;
            case -2201:
                result = "BSFERR_QRCODE_INVALIDO";
                break;
            case -2202:
                result = "BSFERR_VERSAOJAATUALIZADA";
                break;
            case -2203:
                result = "BSFERR_LINKID_INVALIDO";
                break;
            case -2204:
                result = "BSFERR_LINK_STATUS_INDISP";
                break;
            case -2205:
                result = "BSFERR_PIX_EM_PROCESSAMENTO";
                break;
            case -2206:
                result = "BSFERR_PIX_IMPOSSIVEL_DESFAZ";
                break;
            case -2207:
                result = "BSFERR_PIX_UTILIZE_DEVOLUCAO";
                break;
            case -2208:
                result = "BSFERR_TRX_UTILIZE_CANCELAM";
                break;
            case -2209:
                result = "BSFERR_SEM_TRNS_DEVOL";
                break;
            case -2210:
                result = "BSFERR_DEVOL_NAO_PERM";
                break;
            case -2296:
                result = "BSFERR_TROCA_INTERFACE_ICC";
                break;
            case -2297:
                result = "BSFERR_TROCA_INTERFACE_MAG";
                break;
            case -2298:
                result = "BSFERR_DECISAO_RECUSADO";
                break;
            case -2299:
                result = "BSFERR_IMPRESSORA_GENERICO";
                break;
            case -2300:
                result = "BSFERR_SAFRAPAY_OCUPADO";
                break;
            case -2301:
                result = "BSFERR_SEM_SUPORTE_KEYBOARD";
                break;
            case -2350:
                result = "BSFERR_FUNCAO_INDISPONIVEL_NO_TERMINAL";
                break;
        }
        return result;
    }
}