package cordova.plugin.netcontroll.integration;

import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.graphics.Bitmap;
import android.os.Environment;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;

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.IOException;

import cn.wintec.aidl.CashboxService;
import cn.wintec.aidl.DispC035Service;
import cn.wintec.aidl.LEDService;
import cn.wintec.aidl.LabelPrinterService;
import cn.wintec.aidl.PrinterService;
import cn.wintec.aidl.ScaleListener;
import cn.wintec.aidl.ScaleService;
import cn.wintec.aidl.WintecManagerService;

public class POStech {

    //Cordova/Java Params
    private Activity mActivity;
    private Context mContext;
    private CordovaInterface mCordova;
    private CordovaWebView mWebView;

    private int TamanhoBobina;
    private int RotacionarImpresso;

    private WintecManagerService WINTEC;
    private PrinterService printer;
    private LabelPrinterService labelprinter;
    public static ScaleService scaleService;
    public static DispC035Service dispC035Service;
    public static LEDService ledService;
    public static CashboxService cashboxService;


    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 {
                Intent intent = new Intent();
                intent.setAction("cn.wintec.SERVICE");
                intent.setPackage("cn.wintec.sdk");
                mActivity.bindService(intent, conn, Service.BIND_AUTO_CREATE);
                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 {
                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 -> {
                    Bitmap dadosImg = bitmapResult;

                    try {
                        dadosImg = cordova.plugin.netcontroll.integration.util.NetControllPrinter.ResizeBitmap(dadosImg, 550);
                        dadosImg = cordova.plugin.netcontroll.integration.util.NetControllPrinter.RotacionarBitmap(dadosImg, 180);
                    } catch (Exception err) {
                    }

                    try {
                        printer.PRN_OpenUSB(0, 0);
                        printer.PRN_Init();
                        Boolean seguirImpressao = printer.PRN_GetPaperStatus();

                        if (!seguirImpressao) {
                            printer.PRN_Close();
                            callbackContext.error("ImpressaoTextoNetPrintImg error: Sem papel!");
                        } else {
                            printer.PRN_SetDensity(0);
                            printer.PRN_PrintDotBitmap(dadosImg, 0);
                            printer.PRN_PrintAndFeedLine(5);
                            printer.PRN_CutPaper();
                            printer.PRN_Close();

                            callbackContext.success(callbackContextMessageBase + "Success");
                        }
                    } catch (RemoteException e) {
                    }
                });
            } catch (Exception e) {
                callbackContext.error("ImpressaoTextoNetPrintImg error: " + e.toString());
            }
            return true;
        }
        return false;
    }

    //region Methods

    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 获取远程Service的onBind方法返回的对象的代理
            WINTEC = WintecManagerService.Stub.asInterface(service);
            try {
                Log.e("13","连接成功");
                printer = PrinterService.Stub.asInterface(WINTEC.getPrinterService());
                labelprinter = LabelPrinterService.Stub.asInterface(WINTEC.getLabelPrinterService());
                scaleService = ScaleService.Stub.asInterface(WINTEC.getScaleService());
                dispC035Service = DispC035Service.Stub.asInterface(WINTEC.getDispC035Service());
                ledService = LEDService.Stub.asInterface(WINTEC.getLEDService());
                cashboxService = CashboxService.Stub.asInterface(WINTEC.getCashboxService());



            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            WINTEC = null;
        }
    };
}
