package cordova.plugin.netcontroll.integration.fiserv;

import static android.app.Activity.RESULT_CANCELED;
import static android.app.Activity.RESULT_OK;
import static cordova.plugin.netcontroll.integration.util.NetControllHelpers.parseObjToJsonSrtring;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.os.RemoteException;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaWebView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.content.ComponentName;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

//import br.com.execucao.posmp_api.util.DeviceInfo;

import com.google.gson.Gson;

import br.com.execucao.posmp_api.SmartPosHelper;
import br.com.execucao.posmp_api.connection.Connectivity;
import br.com.execucao.posmp_api.printer.PrinterService;
import br.com.execucao.posmp_api.store.AppStatus;

import br.com.execucao.smartPOSService.printer.IOnPrintFinished;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;


public class FiservPOS {
    //Cordova/Java Params
    public Activity mActivity;
    public Context mContext;
    public CordovaInterface mCordova;
    private CordovaWebView mWebView;
    private PrinterService printerService;


    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
        mActivity = cordova.getActivity();
        mContext = cordova.getActivity().getApplicationContext();
        mCordova = cordova;
        mWebView = webView;
        initializeSmartPosHelper();
        initializePrinterService();
    }


    private void initializeSmartPosHelper() {
        if (SmartPosHelper.getInstance() == null)
            SmartPosHelper.init(this.mContext, AppStatus.ACTIVE);
    }

    /**
     * Inicializa o serviço da impressora
     */
    private void initializePrinterService() {
        printerService = SmartPosHelper.getInstance().getPrinter();
        printerService.open();
    }

    private boolean isPrinterServiceAvailable() {
        boolean result = false;
        try {
            result = printerService != null && printerService.isConnected();
        } catch (Exception e) {
            e.printStackTrace();
        }

        //Log.i(TAG, "isPrinterServiceAvailable result: " + result);

        return result;
    }

    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        String callbackContextMessageBase = "Result Fiserv POS - " + action + ": ";
        if (action.equals("IniciarTransacao")) {
            JSONObject params = args.getJSONObject(0);
            try {
                String provedorSitef = params.getString("provedorSitef");
                String empresaSitef = params.getString("empresaSitef");
                String enderecoSitef = params.getString("enderecoSitef");
                String cnpjSitef = params.getString("cnpjSitef");
                String cnpjAutomacao = params.getString("cnpjAutomacao");
                String comExterna = params.getString("comExterna");
                String acessibilidadeVisual = params.getString("acessibilidadeVisual");

                String parcelasStr = params.getString("parcelas");
                String tipoPagamento = params.getString("tipoPagamento");
                String valorSrt = params.getString("valor");

                int parcelas = -1;
                try {
                    parcelas = Integer.parseInt(parcelasStr);
                } catch (Exception ignored) {
                }

                Date agora = new Date();
                SimpleDateFormat formatoData = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
                SimpleDateFormat formatoHora = new SimpleDateFormat("HHmmss", Locale.getDefault());
                
                String data = formatoData.format(agora); // AAAAMMDD
                String hora = formatoHora.format(agora); // HHMMSS
                String numeroCupom = data + hora;

                try {
                    Intent i;
                    switch (tipoPagamento) {
                        case "2": //DÉBITO A VISTA
                            i = new Intent(provedorSitef);
                            i.putExtra("empresaSitef", empresaSitef);
                            i.putExtra("enderecoSitef", enderecoSitef);
                            i.putExtra("modalidade", tipoPagamento);
                            i.putExtra("restricoes", "TransacoesHabilitadas=16");
                            i.putExtra("valor", valorSrt);
                            i.putExtra("CNPJ_CPF", cnpjSitef);
                            i.putExtra("cnpj_automacao", cnpjAutomacao);
                            i.putExtra("comExterna", comExterna);
                            i.putExtra("acessibilidadeVisual", acessibilidadeVisual);

                            i.putExtra("data", data);
                            i.putExtra("hora", hora);
                            i.putExtra("numeroCupom", numeroCupom);

                            CordovaPlugin transacaoDebito = new CordovaPlugin() {
                                @Override
                                public void onActivityResult(int requestCode, int resultCode, Intent data) {
                                    if (requestCode == 1234) {
                                        if (resultCode == RESULT_OK && data != null) {
                                            Bundle extras = data.getExtras();
                                            String codResp = extras.getString("CODRESP");

                                            String tipoCampos = data.getExtras().getString("TIPO_CAMPOS");
                                            JSONObject jsonCampos= null;
                                            try {
                                                jsonCampos = new JSONObject(tipoCampos);
                                            } catch (JSONException e) {
                                            }

                                            String jsonString = montarJson(jsonCampos, codResp);

                                            callbackContext.success(jsonString);
                                        } else if (resultCode == RESULT_CANCELED) {
                                            String msgErro = "Operação cancelada pelo operador!";
                                            if (data != null) {
                                                Bundle extras = data.getExtras();
                                                String codResp = extras.getString("CODRESP");
                                                msgErro = mapearStatusMensagem(codResp);
                                            }
                                            callbackContext.error(msgErro);
                                        }
                                    }
                                }
                            };
                            mCordova.startActivityForResult(transacaoDebito, i,1234);
                            break;
                        case "3": //CRÉDITO

                            i = new Intent(provedorSitef);
                            i.putExtra("empresaSitef", empresaSitef);
                            i.putExtra("enderecoSitef", enderecoSitef);
                            i.putExtra("modalidade", tipoPagamento);
                            i.putExtra("valor", valorSrt);
                            i.putExtra("CNPJ_CPF", cnpjSitef);
                            i.putExtra("cnpj_automacao", cnpjAutomacao);
                            i.putExtra("comExterna", comExterna);
                            i.putExtra("acessibilidadeVisual", acessibilidadeVisual);

                            if (parcelas > 0) {
                                i.putExtra("restricoes", "TransacoesHabilitadas=27");
                                i.putExtra("numParcelas", parcelasStr);
                            } else {
                                i.putExtra("restricoes", "TransacoesHabilitadas=26");
                            }

                            i.putExtra("data", data);
                            i.putExtra("hora", hora);
                            i.putExtra("numeroCupom", numeroCupom);

                            CordovaPlugin transacaoCredito = new CordovaPlugin() {
                                @Override
                                public void onActivityResult(int requestCode, int resultCode, Intent data) {
                                    if (requestCode == 1234) {
                                        if (resultCode == RESULT_OK && data != null) {

                                            Bundle extras = data.getExtras();
                                            String codResp = extras.getString("CODRESP");

                                            String tipoCampos = data.getExtras().getString("TIPO_CAMPOS");
                                            JSONObject jsonCampos= null;
                                            try {
                                                jsonCampos = new JSONObject(tipoCampos);
                                            } catch (JSONException e) {
                                            }

                                            String jsonString = montarJson(jsonCampos, codResp);

                                            callbackContext.success(jsonString);
                                        } else if (resultCode == RESULT_CANCELED) {
                                            String msgErro = "Operação cancelada pelo operador!";
                                            if (data != null) {
                                                Bundle extras = data.getExtras();
                                                String codResp = extras.getString("CODRESP");
                                                msgErro = mapearStatusMensagem(codResp);
                                            }
                                            callbackContext.error(msgErro);
                                        }
                                    }
                                }
                            };
                            mCordova.startActivityForResult(transacaoCredito, i,1234);

                            break;
                            
                        case "122": //PIX

                            i = new Intent(provedorSitef);
                            i.putExtra("empresaSitef", empresaSitef);
                            i.putExtra("enderecoSitef", enderecoSitef);
                            i.putExtra("modalidade", tipoPagamento);
                            i.putExtra("valor", valorSrt);
                            i.putExtra("CNPJ_CPF", cnpjSitef);
                            i.putExtra("cnpj_automacao", cnpjAutomacao);
                            i.putExtra("transacoesHabilitadas", "7;8;");
                            i.putExtra("restricoes", "CarteirasDigitaisHabilitadas=027160110024");
                            i.putExtra("comExterna", comExterna);
                            i.putExtra("acessibilidadeVisual", acessibilidadeVisual);

                            i.putExtra("data", data);
                            i.putExtra("hora", hora);
                            i.putExtra("numeroCupom", numeroCupom);

                            CordovaPlugin transacaoPix = new CordovaPlugin() {
                                @Override
                                public void onActivityResult(int requestCode, int resultCode, Intent data) {
                                    if (requestCode == 1234) {
                                        if (resultCode == RESULT_OK && data != null) {

                                            Bundle extras = data.getExtras();
                                            String codResp = extras.getString("CODRESP");

                                            String tipoCampos = data.getExtras().getString("TIPO_CAMPOS");
                                            JSONObject jsonCampos= null;
                                            try {
                                                jsonCampos = new JSONObject(tipoCampos);
                                            } catch (JSONException e) {
                                            }

                                            String jsonString = montarJson(jsonCampos, codResp);

                                            callbackContext.success(jsonString);
                                        } else if (resultCode == RESULT_CANCELED) {
                                            String msgErro = "Operação cancelada pelo operador!";
                                            if (data != null) {
                                                Bundle extras = data.getExtras();
                                                String codResp = extras.getString("CODRESP");
                                                msgErro = mapearStatusMensagem(codResp);
                                            }
                                            callbackContext.error(msgErro);
                                        }
                                    }
                                }
                            };
                            mCordova.startActivityForResult(transacaoPix, i,1234);
                            break;

                        default:
                            //Carteira Digital
                            i = new Intent(provedorSitef);
                            i.putExtra("empresaSitef", empresaSitef);
                            i.putExtra("enderecoSitef", enderecoSitef);
                            i.putExtra("modalidade", tipoPagamento);
                            i.putExtra("valor", valorSrt);
                            i.putExtra("CNPJ_CPF", cnpjSitef);
                            i.putExtra("cnpj_automacao", cnpjAutomacao);
                            i.putExtra("transacoesHabilitadas", "7;8;");
                            i.putExtra("comExterna", comExterna);
                            i.putExtra("acessibilidadeVisual", acessibilidadeVisual);

                            i.putExtra("data", data);
                            i.putExtra("hora", hora);
                            i.putExtra("numeroCupom", numeroCupom);

                            CordovaPlugin transacaoCarteiraDigital = new CordovaPlugin() {
                                @Override
                                public void onActivityResult(int requestCode, int resultCode, Intent data) {
                                    if (requestCode == 1234) {
                                        if (resultCode == RESULT_OK && data != null) {
                                            Bundle extras = data.getExtras();
                                            String codResp = extras.getString("CODRESP");

                                            String tipoCampos = data.getExtras().getString("TIPO_CAMPOS");
                                            JSONObject jsonCampos= null;
                                            try {
                                                jsonCampos = new JSONObject(tipoCampos);
                                            } catch (JSONException e) {
                                            }

                                            String jsonString = montarJson(jsonCampos, codResp);

                                            callbackContext.success(jsonString);
                                        } else if (resultCode == RESULT_CANCELED) {
                                            String msgErro = "Operação cancelada pelo operador!";
                                            if (data != null) {
                                                Bundle extras = data.getExtras();
                                                String codResp = extras.getString("CODRESP");
                                                msgErro = mapearStatusMensagem(codResp);
                                            }
                                            callbackContext.error(msgErro);
                                        }
                                    }
                                }
                            };
                            mCordova.startActivityForResult(transacaoCarteiraDigital, i,1234);

                            break;
                    }
                } catch (Exception ignored) {
                }

                return true;
            } catch (Exception error1) {
                callbackContext.error("Result - Fiserv - IniciarTransacao: " + "Error Detail: " + error1);
            }
            return false;
        } else if (action.equals("CancelarTransacao")) {
            JSONObject params = args.getJSONObject(0);
            try {
                String provedorSitef = params.getString("provedorSitef");
                String empresaSitef = params.getString("empresaSitef");
                String enderecoSitef = params.getString("enderecoSitef");
                String cnpjSitef = params.getString("cnpjSitef");
                String cnpjAutomacao = params.getString("cnpjAutomacao");
                String tipoPagamento = params.getString("tipoPagamento");
                String comExterna = params.getString("comExterna");
                String cAut = params.getString("cAut");
                String dataTransacao = params.getString("dataTransacao");

                Intent i = new Intent(provedorSitef);
                i.putExtra("empresaSitef", empresaSitef);
                i.putExtra("enderecoSitef", enderecoSitef);
                i.putExtra("modalidade", tipoPagamento);
                i.putExtra("CNPJ_CPF", cnpjSitef);
                i.putExtra("cnpj_automacao", cnpjAutomacao);
                i.putExtra("comExterna", comExterna);
                i.putExtra("restricoes", "TransacoesAdicionaisHabilitadas=7;8;3919");

                String tipoCampos = "{\"516\":\"" + cAut + "\","
                        + "\"515\":\"" + dataTransacao + "\"}";

                i.putExtra("tipoCampos", tipoCampos);

                Date agora = new Date();
                SimpleDateFormat formatoData = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
                SimpleDateFormat formatoHora = new SimpleDateFormat("HHmmss", Locale.getDefault());
                
                String data = formatoData.format(agora); // AAAAMMDD
                String hora = formatoHora.format(agora); // HHMMSS
                String numeroCupom = data + hora;

                i.putExtra("data", data);
                i.putExtra("hora", hora);
                i.putExtra("numeroCupom", numeroCupom);

                CordovaPlugin CancelarTransacao = new CordovaPlugin() {
                    @Override
                    public void onActivityResult(int requestCode, int resultCode, Intent data) {
                        if (requestCode == 1234) {
                            if (resultCode == RESULT_OK && data != null) {
                                Bundle extras = data.getExtras();
                                String codResp = extras.getString("CODRESP");

                                String tipoCampos = data.getExtras().getString("TIPO_CAMPOS");
                                JSONObject jsonCampos= null;
                                try {
                                    jsonCampos = new JSONObject(tipoCampos);
                                } catch (JSONException e) {
                                }

                                String jsonString = montarJson(jsonCampos, codResp);

                                callbackContext.success(jsonString);
                            } else if (resultCode == RESULT_CANCELED) {
                                String msgErro = "Operação cancelada pelo operador!";
                                if (data != null) {
                                    Bundle extras = data.getExtras();
                                    String codResp = extras.getString("CODRESP");
                                    msgErro = mapearStatusMensagem(codResp);
                                }
                                callbackContext.error(msgErro);
                            }
                        }
                    }
                };
                mCordova.startActivityForResult(CancelarTransacao, i,1234);
                return true;
            } catch (Exception error1) {
                callbackContext.error("Result - Fiserv - CancelarTransacao: " + "Error Detail: " + error1);
            }
            return false;
        } else if (action.equals("ReimprimirTransacao")) {
            JSONObject params = args.getJSONObject(0);
            try {
                String provedorSitef = params.getString("provedorSitef");
                String empresaSitef = params.getString("empresaSitef");
                String enderecoSitef = params.getString("enderecoSitef");
                String cnpjSitef = params.getString("cnpjSitef");
                String cnpjAutomacao = params.getString("cnpjAutomacao");
                String tipoPagamento = params.getString("tipoPagamento");
                String comExterna = params.getString("comExterna");

                Intent i = new Intent(provedorSitef);
                i.putExtra("empresaSitef", empresaSitef);
                i.putExtra("enderecoSitef", enderecoSitef);
                i.putExtra("modalidade", tipoPagamento);
                i.putExtra("CNPJ_CPF", cnpjSitef);
                i.putExtra("cnpj_automacao", cnpjAutomacao);
                i.putExtra("comExterna", comExterna);

                Date agora = new Date();
                SimpleDateFormat formatoData = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
                SimpleDateFormat formatoHora = new SimpleDateFormat("HHmmss", Locale.getDefault());
                
                String data = formatoData.format(agora); // AAAAMMDD
                String hora = formatoHora.format(agora); // HHMMSS
                String numeroCupom = data + hora;

                i.putExtra("data", data);
                i.putExtra("hora", hora);
                i.putExtra("numeroCupom", numeroCupom);

                CordovaPlugin ReimprimirTransacao = new CordovaPlugin() {
                    @Override
                    public void onActivityResult(int requestCode, int resultCode, Intent data) {
                        if (requestCode == 1234) {
                            if (resultCode == RESULT_OK && data != null) {
                                Bundle extras = data.getExtras();
                                String codResp = extras.getString("CODRESP");

                                String tipoCampos = data.getExtras().getString("TIPO_CAMPOS");
                                JSONObject jsonCampos= null;
                                try {
                                    jsonCampos = new JSONObject(tipoCampos);
                                } catch (JSONException e) {
                                }

                                String jsonString = montarJson(jsonCampos, codResp);

                                callbackContext.success(jsonString);
                            } else if (resultCode == RESULT_CANCELED) {
                                String msgErro = "Operação cancelada pelo operador!";
                                if (data != null) {
                                    Bundle extras = data.getExtras();
                                    String codResp = extras.getString("CODRESP");
                                    msgErro = mapearStatusMensagem(codResp);
                                }
                                callbackContext.error(msgErro);
                            }
                        }
                    }
                };
                mCordova.startActivityForResult(ReimprimirTransacao, i,1234);
                return true;
            } catch (Exception error1) {
                callbackContext.error("Result - Fiserv - ReimprimirTransacao: " + "Error Detail: " + error1);
            }
            return false;
        } else if (action.equals("MenuAdministrativo")) {
            JSONObject params = args.getJSONObject(0);
            try {
                String provedorSitef = params.getString("provedorSitef");
                String empresaSitef = params.getString("empresaSitef");
                String enderecoSitef = params.getString("enderecoSitef");
                String cnpjSitef = params.getString("cnpjSitef");
                String cnpjAutomacao = params.getString("cnpjAutomacao");
                String tipoPagamento = params.getString("tipoPagamento");
                String comExterna = params.getString("comExterna");

                Intent i = new Intent(provedorSitef);
                i.putExtra("empresaSitef", empresaSitef);
                i.putExtra("enderecoSitef", enderecoSitef);
                i.putExtra("modalidade", tipoPagamento);
                i.putExtra("CNPJ_CPF", cnpjSitef);
                i.putExtra("cnpj_automacao", cnpjAutomacao);
                i.putExtra("comExterna", comExterna);
                i.putExtra("restricoes", "TransacoesAdicionaisHabilitadas=7;8;3919");

                Date agora = new Date();
                SimpleDateFormat formatoData = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
                SimpleDateFormat formatoHora = new SimpleDateFormat("HHmmss", Locale.getDefault());
                
                String data = formatoData.format(agora); // AAAAMMDD
                String hora = formatoHora.format(agora); // HHMMSS
                String numeroCupom = data + hora;

                i.putExtra("data", data);
                i.putExtra("hora", hora);
                i.putExtra("numeroCupom", numeroCupom);

                CordovaPlugin MenuAdministrativo = new CordovaPlugin() {
                    @Override
                    public void onActivityResult(int requestCode, int resultCode, Intent data) {
                        if (requestCode == 1234) {
                            if (resultCode == RESULT_OK && data != null) {
                                Bundle extras = data.getExtras();
                                String codResp = extras.getString("CODRESP");

                                String tipoCampos = data.getExtras().getString("TIPO_CAMPOS");
                                JSONObject jsonCampos= null;
                                try {
                                    jsonCampos = new JSONObject(tipoCampos);
                                } catch (JSONException e) {
                                }

                                String jsonString = montarJson(jsonCampos, codResp);

                                callbackContext.success(jsonString);
                            } else if (resultCode == RESULT_CANCELED) {
                                String msgErro = "Operação cancelada pelo operador!";
                                if (data != null) {
                                    Bundle extras = data.getExtras();
                                    String codResp = extras.getString("CODRESP");
                                    msgErro = mapearStatusMensagem(codResp);
                                }
                                callbackContext.error(msgErro);
                            }
                        }
                    }
                };
                mCordova.startActivityForResult(MenuAdministrativo, i,1234);
                return true;
            } catch (Exception error1) {
                callbackContext.error("Result - Fiserv - MenuAdministrativo: " + "Error Detail: " + error1);
            }
            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 exStr = ex.toString();
                    String exStr2 = ex.toString();
                }
                String html = cordova.plugin.netcontroll.integration.util.NetControllPrinter.ConverterTextoImpressoToHtml(dados, negrito);
                cordova.plugin.netcontroll.integration.util.NetControllPrinter.ConverterHtmlToBitmap(html, mContext, bitmapResult -> {
                    Bitmap dadosImg = bitmapResult;
                    if (isPrinterServiceAvailable()) {
                        printerService.printImage(dadosImg, new IOnPrintFinished.Stub() {
                            @Override
                            public void onSuccess() throws RemoteException {
                                callbackContext.success("Fiserv - ImpressaoTextoNetPrintImg - Impresso gerado com sucesso");
                            }

                            @Override
                            public void onFailed(int error, String msg) throws RemoteException {
                                callbackContext.error("Fiserv - ImpressaoTextoNetPrintImg - Erro na impressão");
                            }
                        });
                    }
                });
            } 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);
                if (isPrinterServiceAvailable()) {
                    printerService.printImage(dadosImg, new IOnPrintFinished.Stub() {
                        @Override
                        public void onSuccess() throws RemoteException {
                            callbackContext.success("Fiserv - ImpressaoBase64NetPrint - Impresso gerado com sucesso");
                        }

                        @Override
                        public void onFailed(int error, String msg) throws RemoteException {
                            callbackContext.error("Fiserv - ImpressaoBase64NetPrint - Erro na impressão");
                        }
                    });
                }

            } catch (Exception e) {
                callbackContext.error("PrintTesteBase64 error: " + e.toString());
            }
            return true;
        } else if (action.equals("DefinirAppInicio")) {
            JSONObject params = args.getJSONObject(0);
            try {
                defineHomeApp(callbackContext, this.mCordova);
            } catch (Exception e) {
                callbackContext.error("DefinirAppInicio error: " + e);
            }
            return true;
        }
        return false;
    }

    public static String montarJson(JSONObject tipoCampos, String codResp) {
        Map<String, Object> response = new HashMap<>();

        // Mapeamento do statusResp
        Map<String, String> statusResp = new HashMap<>();
        statusResp.put("codigo", codResp);
        statusResp.put("mensagem", mapearStatusMensagem(codResp));
        response.put("statusResp", statusResp);

        response.put("mensagem", "0".equals(codResp) ? "sucesso" : "erro");

        // Pega os campos do JSONObject (como string) e insere no mapa
        response.put("bandeira", getJsonValue(tipoCampos, "156").trim());
        response.put("viaCliente", getJsonValue(tipoCampos, "121"));
        response.put("viaCaixa", getJsonValue(tipoCampos, "122"));
        response.put("nsu", getJsonValue(tipoCampos, "133"));
        response.put("cAut", getJsonValue(tipoCampos, "134"));

        return new Gson().toJson(response);
    }

    // Retorna o primeiro valor do array como String (ou "" se não existir)
    private static String getJsonValue(JSONObject jsonObject, String key) {
        try {
            JSONArray array = jsonObject.optJSONArray(key);
            if (array != null && array.length() > 0) {
                return array.optString(0, "");
            }
        } catch (Exception e) {
            // Falha ao extrair o valor – retorna vazio
        }
        return "";
    }

    private static String mapearStatusMensagem(String codResp) {
        try {
            int code = Integer.parseInt(codResp);
            switch (code) {
                case 0: return "Sucesso na execução da função.";
                case 1: return "Endereço IP inválido ou não resolvido.";
                case 2: return "Código da loja inválido.";
                case 3: return "Código de terminal inválido.";
                case 6: return "Erro na inicialização do Tcp/Ip.";
                case 7: return "Falta de memória.";
                case 8: return "Não encontrou a CliSiTef ou ela está com problemas.";
                case 9: return "Configuração de servidores SiTef foi excedida.";
                case 10: return "Erro de acesso na pasta CliSiTef.";
                case 11: return "Dados inválidos passados pela automação.";
                case 12: return "Modo seguro não ativo.";
                case 13: return "Caminho DLL inválido.";
                default:
                    if (code > 0) return "Negada pelo autorizador.";
                    switch (code) {
                        case -1: return "Módulo não inicializado.";
                        case -2: return "Operação cancelada pelo operador.";
                        case -3: return "Função/modalidade inválida.";
                        case -4: return "Falta de memória no PDV.";
                        case -5: return "Sem comunicação com o SiTef.";
                        case -6: return "Cancelada pelo usuário no pinpad.";
                        case -9: return "ContinuaFunção chamada sem iniciar função.";
                        case -10: return "Parâmetro obrigatório ausente.";
                        case -12: return "Rotina iterativa não finalizada.";
                        case -13: return "Documento fiscal não encontrado.";
                        case -15: return "Cancelada pela automação.";
                        case -20: return "Parâmetro inválido.";
                        case -25: return "Erro Correspondente Bancário: sangria.";
                        case -30: return "Erro de acesso a arquivo.";
                        case -40: return "Transação negada pelo SiTef.";
                        case -41: return "Dados inválidos.";
                        case -43: return "Erro na execução no pinpad.";
                        case -50: return "Transação não segura.";
                        case -100: return "Erro interno do módulo.";
                        default: return "Erro interno desconhecido.";
                    }
            }
        } catch (NumberFormatException e) {
            return "Código de resposta inválido.";
        }
    }

    /**
     * Define o aplicativo como launcher padrão
     */
    private void defineHomeApp(final CallbackContext callbackContext, CordovaInterface cordova) {
        cordova.getThreadPool().execute(new Runnable() {
            public void run() {
                try {
                    Context context = cordova.getActivity();
                    String packageName = context.getPackageName();

                    // Obter nome do app
                    int resId = context.getResources().getIdentifier("app_name", "string", packageName);
                    String appLabel = resId != 0 ? context.getResources().getString(resId) : "Default App Name";

                    // Verificar se o serviço está disponível
                    String action = "br.com.bin.service.DefineHomeAppService.action.DEFINE_HOME_APP";

                    // Criar intent para o serviço
                    Intent intent = new Intent();
                    intent.setComponent(getHomeAppComponentName());
                    intent.setAction(action);
                    intent.putExtra("br.com.bin.service.DefineHomeAppService.extra.PACKAGE_NAME", packageName);
                    intent.putExtra("br.com.bin.service.DefineHomeAppService.extra.APP_LABEL", appLabel);

                    // Iniciar o serviço
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                        context.startForegroundService(intent);
                    } else {
                        context.startService(intent);
                    }

                    callbackContext.success("Solicitação para definir como launcher enviada com sucesso");

                } catch (Exception e) {
                    callbackContext.error("Erro ao definir como launcher: " + e.getMessage());
                }
            }
        });
    }

    /**
     * Obtém o ComponentName de acordo com o modelo de terminal
     */
    private ComponentName getHomeAppComponentName() {
        String pkg;
        String model = Build.MODEL;

        // Definir o pacote correto com base no modelo do dispositivo
        switch (model) {
            case "GPOS780":
                pkg = "br.com.bin.gpos780";
                break;
            case "GPOS760":
                pkg = "br.com.bin.gpos760";
                break;
            case "GPOS720":
                pkg = "br.com.bin.gpos720";
                break;
            case "P2-B":
                pkg = "br.com.bin.P2";
                break;
            case "P2-A11":
                pkg = "br.com.bin.P2A11";
                break;
            case "L400":
                pkg = "br.com.bin.l400";
                break;
            case "T19":
                pkg = "br.com.bin.T19";
                break;
            case "T8":
                pkg = "br.com.bin.T8";
                break;
            case "T4":
                pkg = "br.com.bin.T8";
                break;
            case "DX4000":
                pkg = "br.com.bin.dx4000";
                break;
            case "EX6000":
                pkg = "br.com.bin.ex6000";
                break;
            case "EX4000":
                pkg = "br.com.bin.ex4000";
                break;
            default:
                pkg = "br.com.bin";
                break;
        }

        return new ComponentName(pkg, "br.com.bin.service.DefineHomeAppService");
    }

}