package com.jeequan.jeepay.core.model.applyment;

import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.jeequan.jeepay.core.constants.CS;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;

@Data
public class LklpayApplymentInfo extends ApplymentBasicInfo {

    private String merRegName;

    /** 进件POS类型 **/
    private String posType;

    /** 商户经营内容 **/
    private String merBusiContent;

    /** 其他附件 **/
    private String otherFile;

    /** 协议照片 **/
    private String agreementImg;

    /** 电子合同编号 **/
    private String contractNo;

    /** 结算账户开户行行号 **/
    private String openningBankCode;

    /** 结算账户开户行名称 **/
    private String openningBankName;

    /** 结算账户清算行号 **/
    private String clearingBankCode;

    /**
     * 开户银行地区码
     */
    private JSONArray settleAreaCode;

    /**
     * 开户银行地区
     */
    private JSONArray settleAreaName;


    /**
     * @author: xiaoyu
     * @date: 2022/4/19 10:41
     * @describe: 结算账户类型
     */
    public String getSettAccType() {
        if ("B".equalsIgnoreCase(this.settAccountType)) {   // 对公
            return "57";
        }else if ("C".equalsIgnoreCase(this.settAccountType)) { // 对私
            return "58";
        }
        return "";
    }

    /**
     * @author: xiaoyu
     * @date: 2022/4/21 17:58
     * @describe:
     */
    public String coverMcc() {
        if (StringUtils.isNotEmpty(this.mccCode)) {
            String[] split = this.mccCode.split("_");
            return split[1];
        }
        return null;
    }

    /**
     * @author: xiaoyu
     * @date: 2022/4/21 17:58
     * @describe: 有效期截止日期返回值
     */
    public String convertDateEnd(String dateEndStr){
        if ("长期".equals(dateEndStr)) {
            return "9999-12-31";
        }else {
            return dateEndStr;
        }
    }

    /** 类型转换：标准格式 ---》 接口自定义格式 **/
    public JSONArray convertPaywayFeeList(){

        if(this.paywayFeeList == null){
            return null;
        }

        JSONArray result = new JSONArray();
        for (PaywayFee paywayFee : this.paywayFeeList) {

            // 阶梯费率
            if ((paywayFee.getWayCode().startsWith("YSF_") || paywayFee.getWayCode().startsWith("UP_")) && PaywayFee.FEE_TYPE_LEVEL.equals(paywayFee.getFeeType())) {
                // 借记卡费率
                if(CollUtil.isNotEmpty(paywayFee.getLevelList())){
                    JSONObject params1 = new JSONObject();
                    // 费率类型
                    params1.put("feeRateTypeCode", "300");
                    // 类型名称
                    params1.put("feeRateTypeName", "银联借记卡");
                    // 手续费率 借记卡手续费费率（单笔交易≤1000元） 参数单位为‰
                    params1.put("feeRatePct", convertRate(paywayFee.getLevelList().get(0).getFeeRate()) + "");
                    // 借记封顶
//                    params1.put("feeUpperAmtPcnt", AmountUtil.convertCent2Dollar(paywayFee.getMaxFee()));
                    // 单笔保底
//                    params1.put("feeLowerAmtPcnt", AmountUtil.convertCent2Dollar(paywayFee.getMinFee()));
                    result.add(params1);

                    JSONObject params2 = new JSONObject();
                    // 费率类型
                    params2.put("feeRateTypeCode", "314");
                    // 类型名称
                    params2.put("feeRateTypeName", "银联二维码借记卡");
                    // 手续费率 借记卡手续费费率（单笔交易≤1000元） 参数单位为‰
                    params2.put("feeRatePct", convertRate(paywayFee.getLevelList().get(0).getFeeRate()) + "");
                    // 借记封顶
//                    params2.put("feeUpperAmtPcnt", AmountUtil.convertCent2Dollar(paywayFee.getMaxFee()));
                    // 单笔保底
//                    params2.put("feeLowerAmtPcnt", AmountUtil.convertCent2Dollar(paywayFee.getMinFee()));
                    result.add(params2);
                }

                // 贷记卡费率
                if(paywayFee.getCreditCardPaywayFee() != null && CollUtil.isNotEmpty(paywayFee.getCreditCardPaywayFee().getLevelList())){

                    JSONObject params1 = new JSONObject();
                    params1.put("feeRateTypeCode", "301");
                    params1.put("feeRateTypeName", "银联贷记卡");
                    params1.put("feeRatePct", convertRate(paywayFee.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate()) + "");
                    result.add(params1);

                    JSONObject params2 = new JSONObject();
                    params2.put("feeRateTypeCode", "315");
                    params2.put("feeRateTypeName", "银联二维码贷记卡");
                    params2.put("feeRatePct", convertRate(paywayFee.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate()) + "");
                    result.add(params2);
                }
            }

            JSONObject json = new JSONObject();
            // 第一步： 转换产品ID ( 本系统 --》 拉卡拉 )
            String bizProductCode = null;
            switch (paywayFee.getWayCode()){
                case CS.PAY_WAY_CODE.WX_BAR: bizProductCode = "307"; break;
                case CS.PAY_WAY_CODE.WX_JSAPI: bizProductCode = "302"; break;
                case CS.PAY_WAY_CODE.WX_H5: bizProductCode = "302"; break;
                case CS.PAY_WAY_CODE.WX_LITE: bizProductCode = "302"; break;
                case CS.PAY_WAY_CODE.WX_NATIVE: bizProductCode = "302"; break;
                case CS.PAY_WAY_CODE.ALI_BAR: bizProductCode = "308"; break;
                case CS.PAY_WAY_CODE.ALI_JSAPI: bizProductCode = "303"; break;
                case CS.PAY_WAY_CODE.ALI_LITE: bizProductCode = "303"; break;
                case CS.PAY_WAY_CODE.ALI_PC: bizProductCode = "303"; break;
                case CS.PAY_WAY_CODE.ALI_QR: bizProductCode = "303"; break;
                case CS.PAY_WAY_CODE.ALI_WAP: bizProductCode = "303"; break;
            }

            // 拉卡拉不存在该产品
            if(StringUtils.isEmpty(bizProductCode)){
                continue;
            }

            // 费率类型
            json.put("feeRateTypeCode", bizProductCode);
            // 费率类型名称
            json.put("feeRateTypeName", paywayFee.getWayCode());

            // 单笔费率
            if(PaywayFee.FEE_TYPE_SINGLE.equals(paywayFee.getFeeType())){
                json.put("feeRatePct", convertRate(paywayFee.getFeeRate()));
                result.add(json);
            }
        }
        return result;

    }

    public static String convertRate(BigDecimal rate){
        return rate == null ? null : String.valueOf(rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP));
    }

    @Override
    public String bankBranchNo() {
        return openningBankCode;
    }
}
