package cordova.plugin.netcontroll.integration;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Environment;

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 java.io.File;
import java.io.FileOutputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.io.IOException;

import br.com.itfast.tectoy.Dispositivo;
import br.com.itfast.tectoy.TecToy;

public class TecToySumniD2Mini {

    //Cordova/Java Params
    private Activity mActivity;
    private Context mContext;
    private CordovaInterface mCordova;
    private CordovaWebView mWebView;

    private TecToy oTToy;
    private int TamanhoBobina;
    private int RotacionarImpresso;
    private int abrirGaveta;

    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
        mActivity = cordova.getActivity();
        mContext = cordova.getActivity().getApplicationContext();
        mCordova = cordova;
        mWebView = webView;
    }

    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        String callbackContextMessageBase = "Result TecToy Sumni D2Mini - " + action + ": ";
        if (action.equals("Initialize")) {
            JSONObject params = args.getJSONObject(0);
            try {
                String dispositivoStr = params.getString("modeloDispositivo");
                cordova.plugin.netcontroll.integration.util.NetControllPrinter.RequestPermissions(this.mActivity, this.mContext);
                this.initSunmiPrinterService(dispositivoStr, this.mContext);
                callbackContext.success(callbackContextMessageBase + "Success");
                return true;
            } catch (Exception error) {
                callbackContext.error(callbackContextMessageBase + "Error Detail: " + error);
            }
        } else if (action.equals("ImpressaoTextoNetPrint")) {
            JSONObject params = args.getJSONObject(0);
            try {
                if (oTToy == null) {
                    //TODO Service disconnection processing
                    callbackContext.error("Impressora não iniciada");
                    return false;
                }
                String dados = params.getString("dados");
                Boolean negrito = false;
                try {
                    negrito = params.getBoolean("negrito");
                }catch (Exception ex){
                }

//                StatusImpressora statusImpressora = this.tecToyService.statusImpressora();
                boolean abrirGavetaImp = cordova.plugin.netcontroll.integration.util.NetControllPrinter.EnviarAberturaGaveta(dados);
                String html = cordova.plugin.netcontroll.integration.util.NetControllPrinter.ConverterTextoImpressoToHtml(dados, negrito);
                cordova.plugin.netcontroll.integration.util.NetControllPrinter.ConverterHtmlToBitmap(html, mContext, bitmapResult -> {
                    Bitmap dadosImg = bitmapResult;
                    long timestamp = System.currentTimeMillis();
                    String uniqueSuffix = String.valueOf(timestamp);
                    String directoryFileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Download/NetControllPrint_" + uniqueSuffix + ".bmp";
                    try {
                        if (this.TamanhoBobina  == 1) {
                            dadosImg = cordova.plugin.netcontroll.integration.util.NetControllPrinter.ResizeBitmap(dadosImg, 550);
                        }

                        if (this.RotacionarImpresso == 1) {
                            dadosImg = cordova.plugin.netcontroll.integration.util.NetControllPrinter.RotacionarBitmap(dadosImg,180);
                        }

                        String fileName = cordova.plugin.netcontroll.integration.util.NetControllPrinter.SaveImage(dadosImg, directoryFileName);
                        if (!fileName.isEmpty()) {
                            this.ImprimirArquivo(fileName, callbackContext);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    if (abrirGaveta == 1 && abrirGavetaImp) {
                        try {
                            oTToy.abrirGaveta();
                        } catch (Exception e) {}
                    }
                    File file = new File(directoryFileName);
                    if (file.exists()) {
                        file.delete();
                    }
                    callbackContext.success(callbackContextMessageBase + "Success");
                });
            } catch (Exception e) {
                callbackContext.error("ImpressaoTextoNetPrintImg error: " + e.toString());
            }
            return true;
        } else if (action.equals("AbrirGaveta")) {
            try {
                if (oTToy == null) {
                    //TODO Service disconnection processing
                    callbackContext.error("Impressora não iniciada");
                    return false;
                }
                oTToy.abrirGaveta();
                callbackContext.success(callbackContextMessageBase + "Success");
            } catch (Exception e) {
                callbackContext.error("AbrirGaveta error: " + e.toString());
            }
            return true;
        } else if (action.equals("Corte")) {
            try {
                if (oTToy == null) {
                    //TODO Service disconnection processing
                    callbackContext.error("Impressora não iniciada");
                    return false;
                }
                oTToy.acionarGuilhotina();
                callbackContext.success(callbackContextMessageBase + "Success");
            } catch (Exception e) {
                callbackContext.error("Corte error: " + e.toString());
            }
            return true;
        }
        return false;
    }

    //region Methods


    public void initSunmiPrinterService(String dispositivoNome, Context context) {
        try {
            Dispositivo dispositivoEnumItem = GetDispositivoEnumByName(dispositivoNome);
            oTToy = new TecToy(dispositivoEnumItem, mContext);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private boolean ImprimirArquivo(String caminhoArquivo, CallbackContext callbackContext) {
        try {
            if (caminhoArquivo != "") {
                try {
                    oTToy.imprimirImagem(caminhoArquivo);
                    return true;
                } catch (Exception ex) {
                    String exStr = ex.toString();
                    throw ex;
                }
            }
        } catch (Exception errorPost) {
            callbackContext.error("Result - ImprimirArquivo: " + "Error Detail: " + errorPost);
            return false;
        }
        return false;
    }
    private Dispositivo GetDispositivoEnumByName(String dispositivoTypeName) {
        Dispositivo dispositivoTipo = Dispositivo.DESCONHECIDO;
        switch (dispositivoTypeName) {
            case "DESCONHECIDO":
                this.abrirGaveta = 1;
                dispositivoTipo = Dispositivo.DESCONHECIDO;
                this.TamanhoBobina = 0;
                this.RotacionarImpresso = 0;
                break;
            case "T2_MINI":
                this.abrirGaveta = 1;
                dispositivoTipo = Dispositivo.T2_MINI;
                this.TamanhoBobina = 1;
                this.RotacionarImpresso = 0;
                break;
            case "D2_MINI":
                this.abrirGaveta = 1;
                dispositivoTipo = Dispositivo.D2_MINI;
                this.TamanhoBobina = 0;
                this.RotacionarImpresso = 0;
                break;
            case "D2S":
                this.abrirGaveta = 1;
                dispositivoTipo = Dispositivo.D2S;
                this.TamanhoBobina = 0;
                this.RotacionarImpresso = 0;
                break;
            case "V2":
                this.abrirGaveta = 0;
                dispositivoTipo = Dispositivo.V2;
                this.TamanhoBobina = 0;
                this.RotacionarImpresso = 0;
                break;
            case "V2_PRO":
                this.abrirGaveta = 0;
                dispositivoTipo = Dispositivo.V2_PRO;
                this.TamanhoBobina = 0;
                this.RotacionarImpresso = 0;
                break;
            case "K2":
                this.abrirGaveta = 0;
                dispositivoTipo = Dispositivo.K2;
                this.TamanhoBobina = 1;
                this.RotacionarImpresso = 0;
                break;
            case "K2_MINI":
                this.abrirGaveta = 0;
                dispositivoTipo = Dispositivo.K2_MINI;
                this.TamanhoBobina = 1;
                this.RotacionarImpresso = 0;
                break;
            case "T2S":
                this.abrirGaveta = 1;
                dispositivoTipo = Dispositivo.T2S;
                this.TamanhoBobina = 1;
                this.RotacionarImpresso = 0;
                break;
            case "K10":
                this.abrirGaveta = 0;
                dispositivoTipo = Dispositivo.K2;
                this.TamanhoBobina = 0;
                this.RotacionarImpresso = 1;
                break;
            case "K10_MINI":
                this.abrirGaveta = 0;
                dispositivoTipo = Dispositivo.K2;
                this.TamanhoBobina = 0;
                this.RotacionarImpresso = 1;
                break;
            case "P3_MIX":
                this.abrirGaveta = 0;
                dispositivoTipo = Dispositivo.D2S;
                this.TamanhoBobina = 0;
                this.RotacionarImpresso = 0;
                break;
        }
        return dispositivoTipo;
    }
}
