package com.neptune.plugin.models;

import com.getcapacitor.JSObject;
import com.neptune.utils.Convert;
import com.neptune.utils.MyLog;
import com.pax.dal.entity.EPinBlockMode;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.Arrays;

public class PinBlockModel {
    private byte keyIndex ;
    private String pinsLength ;
    private byte[] dataIn ;
    private EPinBlockMode mode ;
    private int timeout ;

    public PinBlockModel(byte keyIndex, String pinsLength, byte[] dataIn, EPinBlockMode mode, int timeout) {
        this.keyIndex = keyIndex;
        this.pinsLength = pinsLength;
        this.dataIn = dataIn;
        this.mode = mode;
        this.timeout = timeout;
        MyLog.logI(this.toString());
    }

    public PinBlockModel(JSONObject jsonObject) throws JSONException {
        this(
                (byte)jsonObject.getInt("keyIndex"),
                jsonObject.getString("pinsLength"),
                panToDataIn(jsonObject.getString("dataIn")),
                EPinBlockModeToEnum(jsonObject.getString("mode")),
                jsonObject.getInt("timeout")
        );
    }
    public static byte[] panToDataIn(String pan){
        byte[] panArray =pan.substring(pan.length() - 13, pan.length() - 1).getBytes();
        final byte[] dataIn = new byte[16];
        dataIn[0] = 0x00;
        dataIn[1] = 0x00;
        dataIn[2] = 0x00;
        dataIn[3] = 0x00;
        System.arraycopy(panArray, 0, dataIn, 4, panArray.length);
        return dataIn;
    }

    public byte getKeyIndex() {
        return keyIndex;
    }

    public String getPinsLength() {
        return pinsLength;
    }

    public byte[] getDataIn() {
        return dataIn;
    }

    public EPinBlockMode getMode() {
        return mode;
    }

    public int getTimeout() {
        return timeout;
    }

    private static EPinBlockMode EPinBlockModeToEnum(String modeType){
        for (EPinBlockMode type : EPinBlockModeValues()) {
            MyLog.logI(type.name());
            if (type.name().equals(modeType)) {
                return type;
            }
        }
        return null;
    }

    public static EPinBlockMode[] EPinBlockModeValues(){
        return new EPinBlockMode[]{
                EPinBlockMode.ISO9564_0,
                EPinBlockMode.ISO9564_1,
                EPinBlockMode.ISO9564_3,
                EPinBlockMode.HKEPS
        };
    }

    @Override
    public String toString() {
        return "PinBlockModel{" +
                "keyIndex=" + keyIndex +
                ", pinsLength='" + pinsLength + '\'' +
                ", dataIn=" + Arrays.toString(dataIn) +
                ", mode=" + mode +
                ", timeout=" + timeout +
                '}';
    }

}
