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

import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONObject;
import com.jeequan.jeepay.core.entity.MchApplyment;
import com.jeequan.jeepay.core.model.params.kdbpay.KdbpayIsvParams;
import com.jeequan.jeepay.core.utils.AmountUtil;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.List;

@Data
public class KdbpayApplymentInfo extends ApplymentBasicInfo {
    /** 商户经营类型 1-现实 2-虚拟 **/
    private String busiLicMain;
    /** 商户企业法人电话 **/
    private String idcardPhone;
    /** 营业执照类型 01-营业执照 02-营业执照 （多证合一） 03-事业单位法人证书 **/
    private String businessLicenseType;
    /** 经营形态 02-普通店 、 01-连锁店 **/
    private String businForm;
    /** 注册资本：单位-万元 **/
    public String capital;
    /** 行业大类 0-标准、1-优惠、2-减免 **/
    public String standardFlag;
    /** 公司规模 1：0-50 人； 2：50-100 人； 3:100 以上 **/
    public String employeeNum;
    /** 组织机构代码照 **/
    public String picInstitutional;
    /** 协议 **/
    public String agreementImg;
    /** 清算授权书 **/
    public String picAuthorization;
    /** 银行号 **/
    public String bankNo;
    /** 联行号 **/
    public String bankLineNo;
    /** 支行名称 **/
    public String bankLineName;

    /** 结算人证据地址 **/
    private String settAccountAdress;
    /** 预留电话 **/
    private String accountPhone;
    /** 商户客服电话 **/
    private String merHotline;

    /** 预留电话(对公) **/
    private String companyAccountPhone;
    /** 银行号(对公) **/
    private String settleBankIdUpTwo;
    /** 联行号(对公)**/
    private String openStlnoTwo;

    /** 清算周期 00-T+1 01-D0 02-D+1 **/
    private String settCycle;

    /** 结算类型 渠道侧只支持D0和D1（20231031） **/
    private String settleWay;

    /** 租赁协议（小微使用） **/
    public String leaseAgreement;

    /**
     * 账号类型
     * 我方： B:对公,C:对私
     * 渠道所需： 01-对公 02-对私 **/
    public String covertSettAccount() {
        if (this.merchantType == MchApplyment.MERCHANT_TYPE_PERSONAL){
            return "02";
        }
        return settAccountType.equals(MchApplyment.SETT_ACCOUNT_TYPE_CORPORATE) ? "01" : "02";
    }

    /**
     * 结算类型（D0,D1）
     * 我方： D0,D1,   DEF 读取服务商默认配置
     **/
    public String covertSettType(KdbpayIsvParams isvParams) {
        if("DEF".equals(this.settleWay)){
            // 读取服务商的配置值
            return StringUtils.defaultString(isvParams.getSettType(), "D1");
        }
        // 进件时没选择，默认D1
        return StringUtils.defaultString(this.settleWay, "D1");
    }

    /**
     * 清算周期：01-D0 02-D+1
     * （基于结算类型上送结算周期）
     **/
    public String covertSettCycle(String settType) {
        if ("D0".equals(settType)){
            return "01";
        }
        return "02";
    }


    /** 商户类目 **/
    public String[] covertMcc() {
        if (StringUtils.isNotEmpty(this.mccCode)) {
            return this.mccCode.split("_");
        }
        return null;
    }

    /** 截止日期转换 **/
    public String convertDate(String dateStr) {
        if ("长期".equals(dateStr)) {
            return "9999.12.31";
        }
        return dateStr.replace("-", ".");
    }

    /**
     *  我方：1-个人, 2-个体工商户, 3-企业, 4-党政、机关及事业单位, 5-其他组织
     *  渠道所需：商户性质 01-企业 02-个体工商户 03-事业单位 04-小微商户
     */
    public String convertMerchantType(){
        if(this.merchantType == MchApplyment.MERCHANT_TYPE_PERSONAL){
            return "04";
        }else if(this.merchantType == MchApplyment.MERCHANT_TYPE_INDIVIDUAL){
            return "02";
        }else if(this.merchantType == MchApplyment.MERCHANT_TYPE_ENTERPRISE){
            return "01";
        }else if(this.merchantType == MchApplyment.MERCHANT_TYPE_GOV){
            return "03";
        }
        return "04";
    }

    /** 费率信息转换 **/
    public JSONObject convertApplymentPayFee() {
        // 费率信息
        JSONObject rateJson = new JSONObject();
        List<PaywayFee> paywayFeeList = this.paywayFeeList;
        // 费率设置列表
        if (paywayFeeList != null && CollectionUtils.isNotEmpty(paywayFeeList)) {
            paywayFeeList.stream().forEach(item -> {
                if (PaywayFee.FEE_TYPE_SINGLE.equals(item.getFeeType())) {
                    // 清算：移动支付计费比例（%） 保留两位小数,如：0.35
                    rateJson.put("jh_rate", convertRate(item.getFeeRate()) + "");
                }

                // 阶梯费率
                if ((item.getWayCode().startsWith("YSF_") || item.getWayCode().startsWith("UP_")) && PaywayFee.FEE_TYPE_LEVEL.equals(item.getFeeType())) {
                    // 借记卡费率
                    if (CollUtil.isNotEmpty(item.getLevelList())) {
                        // 清算：Pos 刷卡-借记卡费率（%）保留两位小数,如：0.35
                        rateJson.put("pos_debit_rate", convertRate(item.getLevelList().get(1).getFeeRate()) + "");
                        // 清算：Pos 刷卡-借记卡封顶金额 以元为单位
                        rateJson.put("pos_debit_limit_max", AmountUtil.convertCent2DollarShort(item.getMaxFee()+""));

                        // 银联：借记卡 借记卡 1000 元以下(含 1000元)以下的费率
                        rateJson.put("d_calc_down_val", convertRate(item.getLevelList().get(0).getFeeRate()) + "");
                        // 银联：借记卡 1000 元以上扣率
                        rateJson.put("d_calc_val", convertRate(item.getLevelList().get(1).getFeeRate()) + "");
                    }
                    // 贷记卡费率（信用卡）
                    if (item.getCreditCardPaywayFee() != null && CollUtil.isNotEmpty(item.getCreditCardPaywayFee().getLevelList())) {
                        // 清算：pos 刷卡-贷记卡费率（%）保留两位小数，如：0.35
                        rateJson.put("pos_credit_rate", convertRate(item.getCreditCardPaywayFee().getLevelList().get(1).getFeeRate()));

                        // 银联：信用卡 1000 元以下(含 1000元)以下的费率
                        rateJson.put("c_calc_down_val", convertRate(item.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate()));
                        // 银联：信用卡 1000 元以上扣率
                        rateJson.put("c_calc_val", convertRate(item.getCreditCardPaywayFee().getLevelList().get(1).getFeeRate()));
                    }
                }
            });
        }
        return rateJson;
    }

    /** 费率转换，单位：% **/
    public static String convertRate(BigDecimal rate) {
        return rate == null ? null : String.valueOf(rate.multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP));
    }

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