package com.neptune.plugin;

import com.getcapacitor.JSObject;
import com.getcapacitor.PluginCall;
import com.neptune.modules.Ped;
import com.neptune.plugin.models.PedModel;
import com.neptune.plugin.models.KeyModel;
import com.neptune.plugin.models.PinBlockModel;
import com.neptune.utils.Convert;
import com.neptune.utils.MyLog;
import com.pax.dal.exceptions.PedDevException;

import org.json.JSONException;

public class NeptunePinHandler {

    public static void getPinBLock(PluginCall call) {
        MyLog.logI("Starting getPinBLock");
        JSObject ret = new JSObject();
        JSObject req = call.getData();
        JSObject value = req.getJSObject("value");

        try {
            PedModel ped= new PedModel(value.getJSONObject("ped"));
            PinBlockModel pinblock= new PinBlockModel(value.getJSONObject("pinblock"));
            Ped.getInstance(ped.getPedType(), ped.getPedMode()).setKeyboardLayoutLandscape(ped.isLandscape());
            Ped.getInstance(ped.getPedType(), ped.getPedMode()).setKeyboardRandom(ped.isRandom());
            Ped.getInstance(ped.getPedType(), ped.getPedMode()).showInputBox(ped.isWithTitle(), ped.getTitle());

            byte[] result = Ped.getInstance(ped.getPedType(), ped.getPedMode())
                    .getPinBlock(
                            pinblock.getKeyIndex(),
                            pinblock.getPinsLength(),
                            pinblock.getDataIn(),
                            pinblock.getMode(),
                            pinblock.getTimeout());

            ret.put("value", Convert.getInstance().bcdToStr(result));
            call.resolve(ret);
        }catch(JSONException e){
            MyLog.logE(e.getMessage());
            call.reject(e.getMessage(), e);
        }
        catch (PedDevException e) {
            MyLog.logE(e.getMessage());
            call.reject(e.getMessage(), e);
        }
    }

    public static void setKey(PluginCall call) {
        MyLog.logI("Starting setPTK");
        JSObject ret = new JSObject();
        JSObject req = call.getData();
        JSObject value = req.getJSObject("value");
        try{
            KeyModel tpk = new KeyModel(value.getJSONObject("key"));
            PedModel ped= new PedModel(value.getJSONObject("ped"));
            Boolean result= Ped.getInstance(ped.getPedType(), ped.getPedMode()).writeKey(
                    tpk.getSrcKeyType(),
                    tpk.getSrcKeyIndex(),
                    tpk.getDestKeyType(),
                    tpk.getDestkeyIndex(),
                    tpk.getDestKeyValue(),
                    tpk.getCheckMode(),
                    tpk.getCheckBufx()
            );
            ret.put("value", result);
            call.resolve(ret);
        }catch(JSONException e){
            MyLog.logE(e.getMessage());
            call.reject(e.getMessage(), e);
        }
        catch (PedDevException e) {
            MyLog.logE(e.getMessage());
            call.reject(e.getMessage(), e);
        }

    }


}
