package acquire.sdk.emv;

import com.morefun.yapi.ServiceResult;
import com.morefun.yapi.emv.EmvAidPara;
import com.morefun.yapi.emv.EmvCapk;
import com.morefun.yapi.emv.EmvHandler;

import org.jpos.tlv.TLVList;

import java.util.List;
import java.util.Optional;

import acquire.base.utils.LoggerUtils;
import acquire.sdk.DeviceHelper;
import acquire.sdk.emv.bean.CapkBean;
import acquire.sdk.emv.ysdk.HexUtil;

public class YsdkEmvParamLoader implements IEmvParamLoader {
    @Override
    public boolean loadCtAid(String aidTlv, boolean isTerminalAid) {
        LoggerUtils.d(aidTlv);
        int ret = 0;
        try {
            EmvHandler emvHandler = DeviceHelper.getEmvHandler();
            if (isTerminalAid) {
                // TODO: Terminal config Pending
                return true;
            } else {
                ret = emvHandler.addAidParam(HexUtil.hexStringToByte(aidTlv));
                LoggerUtils.d("AID Result " + ret);
                return ret == ServiceResult.Success;
            }
        } catch (Exception e) {
            LoggerUtils.w("Exception", e);
            return false;
        }
    }

    @Override
    public boolean loadClessAid(String aidTlv, boolean isTerminalAid) {
        LoggerUtils.i(aidTlv);
        return true;
    }

    @Override
    public boolean loadCapk(CapkBean capkBean) {
        LoggerUtils.i(capkBean.getHash() + ":" + capkBean.getRid());
        int ret = 0;
        try {
            byte[] capkIndex = HexUtil.int2bytes(capkBean.getIndex());
            LoggerUtils.d(HexUtil.bytesToHexString(capkIndex));
            TLVList tlv = new TLVList();
            tlv.append(0x9F06, capkBean.getRid());
            tlv.append(0x9F22, new byte[] {capkIndex[3]});
            tlv.append(0xDF02, HexUtil.hexStringToByte(capkBean.getModulus()));
            int expLen = Optional.ofNullable(capkBean.getExponent()).map(String::length).map(x-> (x %2 == 0) ? x : x+1).orElse(2);
            tlv.append(0xDF04, HexUtil.hexStringToByte(capkBean.getExponent()));
            tlv.append(0xDF03, HexUtil.hexStringToByte(capkBean.getHash()));
            tlv.append(0xDF06, String.valueOf(capkBean.getAlgorithmIndicator()));
            tlv.append(0xDF07, String.valueOf(capkBean.getHashAlgorithm()));
            tlv.append(0xDF05, "20261231");

            byte[] tlvBytes = tlv.pack();
            LoggerUtils.d(HexUtil.bytesToHexString(tlvBytes));
            EmvHandler emvHandler = DeviceHelper.getEmvHandler();
            ret = emvHandler.addCAPKParam (tlvBytes);
            LoggerUtils.d(capkBean.getHash() +" CAPK Result " + ret);
            return ret == ServiceResult.Success;
        } catch (Exception e) {
            LoggerUtils.w("Exception", e);
            return false;
        }

    }

    @Override
    public boolean deleteOneCtAid(String aid9F06) {
        return true;
    }

    @Override
    public boolean deleteOneClessAid(String aid9F06) {
        return true;
    }

    @Override
    public boolean deleteOneCapk(String rid, String index) {
        return true;
    }

    @Override
    public boolean clearCtAid() {
        try {
            EmvHandler emvHandler = DeviceHelper.getEmvHandler();
            emvHandler.clearAIDParam();
        }  catch (Exception e) {
            LoggerUtils.w("Exception", e);
            return false;
        }
        return true;
    }

    @Override
    public boolean clearClessAid() {
        return clearCtAid();
    }

    @Override
    public boolean clearCapk() {
        try {
            EmvHandler emvHandler = DeviceHelper.getEmvHandler();
            emvHandler.clearCAPKParam();
            LoggerUtils.d("CAPKs cleared");
        }  catch (Exception e) {
            LoggerUtils.w("Exception", e);
            return false;
        }
        return true;
    }

    @Override
    public boolean isCtAidLoss() {
        try {
            EmvHandler emvHandler = DeviceHelper.getEmvHandler();
            List<EmvAidPara> aidParas = emvHandler.getAidParaList();


            return Optional.ofNullable(aidParas).map(x -> (x.size() == 0)).orElse(true);
        }  catch (Exception e) {
            LoggerUtils.w("Exception", e);
            return false;
        }
    }

    @Override
    public boolean isClessAidLoss() {
        return isCtAidLoss();
    }

    @Override
    public boolean isCapkLoss() {
        try {
            EmvHandler emvHandler = DeviceHelper.getEmvHandler();
            List<EmvCapk> capkList = emvHandler.getCapkList();
            return Optional.ofNullable(capkList).map(x -> (x.size() == 0)).orElse(true);
        }  catch (Exception e) {
            LoggerUtils.w("Exception", e);
            return false;
        }
    }
}
