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.entity.MchApplyment;
import com.jeequan.jeepay.core.utils.AmountUtil;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;

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

@Data
public class BcmpayApplymentInfo extends ApplymentBasicInfo{

    /** 客服电话 **/
    private String servicePhone;

    /** 支付宝类目 **/
    private String alipayBusiness;

    /** 微信商户通道费率 **/
    private String wechatFeeRate;

    /** 微信结算规则ID **/
    private String wechatStlmRuleId;

    /** 经营范围 **/
    private String licenseBusiness;

    /** 法人手机号 **/
    private String legalPhone;

    /** 法人职业 **/
    private String legalProfession;

    /** 法人性别 **/
    private String idcardSex;

    /** 行业类别 **/
    private String induPriv;

    /** 注册资金 **/
    private String regCapital;

    /** 组织机构代码证号 **/
    private String orgCertCode;

    /** 授权书 **/
    private String authorization;

    /** 客户经理与授权人合影 **/
    private String groupPhoto;

    /** 联行号 **/
    private String openBankNo;

    /** 清算账户 **/
    private String acctId;

    /** 结算周期 06-全D+0 07-D+0 08-D+0.5 09-D0 01-T+1 02-D+1 03-周结 04-月结 05-D+N **/
    private String cptlStlmPerd;

    /** 手续费结算周期 01-日结 02-月结 03-周结 04-季结 **/
    private String feeStlmPerd;

    /** 账户类型 07-本行对公钱包 08-本行对私钱包 05-他行对公 06-他行对私 01-本行对公 03-本行对私 04-内部户 **/
    private String acctType;

    /** 微信费率规则 **/
    private static final Map<String, String> WX_BUS_FEE_ID_MAP = new HashMap<>();;
    static {
        WX_BUS_FEE_ID_MAP.put("757", "0.38%");
        WX_BUS_FEE_ID_MAP.put("758", "0.20%");
        WX_BUS_FEE_ID_MAP.put("759", "0.30%");
        WX_BUS_FEE_ID_MAP.put("764", "0.10%");
        WX_BUS_FEE_ID_MAP.put("765", "0.00%");
        WX_BUS_FEE_ID_MAP.put("771", "1.00%");
        WX_BUS_FEE_ID_MAP.put("760", "0.10%");
        WX_BUS_FEE_ID_MAP.put("761", "0.60%");
        WX_BUS_FEE_ID_MAP.put("762", "0.20%");
        WX_BUS_FEE_ID_MAP.put("763", "0.20%");
        WX_BUS_FEE_ID_MAP.put("766", "0.20%");
        WX_BUS_FEE_ID_MAP.put("767", "0.30%");
        WX_BUS_FEE_ID_MAP.put("768", "0.10%");
        WX_BUS_FEE_ID_MAP.put("769", "0.00%");
        WX_BUS_FEE_ID_MAP.put("770", "0.20%");
    }

    /** 商户类型转换 **/
    public String convertMerchantType() {
        if (MchApplyment.MERCHANT_TYPE_PERSONAL == this.merchantType) {
            // 个人
            return "11";
        }else if (MchApplyment.MERCHANT_TYPE_INDIVIDUAL == this.merchantType) {
            // 个体户
            return "10";
        }else if (MchApplyment.MERCHANT_TYPE_ENTERPRISE == this.merchantType) {
            // 企业
            return "03";
        }
        return "";
    }

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

    /** 支付产品 **/
    public void convertProduct(JSONArray array) {
        List<PaywayFee> paywayFeeList = this.paywayFeeList;
        // 费率设置列表
        if (paywayFeeList != null && CollectionUtils.isNotEmpty(paywayFeeList)) {
            paywayFeeList.stream().forEach(item -> {
                // 阶梯费率
                if ((item.getWayCode().startsWith("YSF_") || item.getWayCode().startsWith("UP_")) && PaywayFee.FEE_TYPE_LEVEL.equals(item.getFeeType())) {
                    JSONObject feeJson = new JSONObject();

                    // 借记卡费率
                    if(CollUtil.isNotEmpty(item.getLevelList())){
                        // 产品名称
                        feeJson.put("uf_pay_type", "11");
                        feeJson.put("fee_fix", AmountUtil.convertCent2DollarShort(item.getMinFee()+""));
                        feeJson.put("fee_up_lmt", AmountUtil.convertCent2DollarShort(item.getMaxFee()+""));

                        // 借记手续费
                        feeJson.put("fee_rate", convertRate(item.getLevelList().get(0).getFeeRate()) + "");
                        // 业务类型
                        feeJson.put("buss_type", "13");
                        // 计费类型 按百分比
                        feeJson.put("fee_type", "1");
                    }

                    // 贷记卡费率
                    if(item.getCreditCardPaywayFee() != null && CollUtil.isNotEmpty(item.getCreditCardPaywayFee().getLevelList())){
                        feeJson.put("fee_rate", convertRate(item.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate()) + "");
                    }
                    JSONObject feeJson2 = JSONObject.parseObject(feeJson.toJSONString());
                    feeJson2.put("uf_pay_type", "12");

                    array.add(feeJson);
                    array.add(feeJson2);
                }

                // 支付宝费率
                if (item.getWayCode().startsWith("ALI_") && PaywayFee.FEE_TYPE_SINGLE.equals(item.getFeeType())) {
                    JSONObject aliJsonFee = new JSONObject();
                    // 产品名称
                    aliJsonFee.put("uf_pay_type", "11");
                    // 业务类型
                    aliJsonFee.put("buss_type", "12");
                    aliJsonFee.put("fee_type", "1");
                    aliJsonFee.put("fee_rate", convertRate(item.getFeeRate()));

                    array.add(aliJsonFee);
                }

                // 微信费率
                if (item.getWayCode().startsWith("WX_") && PaywayFee.FEE_TYPE_SINGLE.equals(item.getFeeType())) {
                    JSONObject wxJsonFee = new JSONObject();
                    wxJsonFee.put("uf_pay_type", "11");
                    // 业务类型
                    wxJsonFee.put("buss_type", "11");
                    wxJsonFee.put("fee_type", "1");
                    wxJsonFee.put("fee_rate", convertRate(item.getFeeRate()));
                    array.add(wxJsonFee);
                }

            });
        }
    }

    /** 支付产品 **/
    public JSONArray converThirdPayList() {
        JSONArray array = new JSONArray();
        List<PaywayFee> paywayFeeList = this.paywayFeeList;
        // 费率设置列表
        if (paywayFeeList != null && CollectionUtils.isNotEmpty(paywayFeeList)) {
            paywayFeeList.stream().forEach(item -> {
                // 阶梯费率
                if ((item.getWayCode().startsWith("YSF_") || item.getWayCode().startsWith("UP_")) && PaywayFee.FEE_TYPE_LEVEL.equals(item.getFeeType())) {
                    JSONObject feeJson = new JSONObject();
                    // 支付类型
                    feeJson.put("third_open_type", "13");
                    array.add(feeJson);
                }

                // 支付宝费率
                if (item.getWayCode().startsWith("ALI_") && PaywayFee.FEE_TYPE_SINGLE.equals(item.getFeeType())) {
                    JSONObject aliJsonFee = new JSONObject();
                    // 支付类型
                    aliJsonFee.put("third_open_type", "12");
                    // 支付宝类目
                    aliJsonFee.put("alipay_business", this.alipayBusiness);
                    array.add(aliJsonFee);
                }

                // 微信费率
                if (item.getWayCode().startsWith("WX_") && PaywayFee.FEE_TYPE_SINGLE.equals(item.getFeeType())) {
                    JSONObject wxJsonFee = new JSONObject();
                    // 支付类型
                    wxJsonFee.put("third_open_type", "11");
                    // 微信费率
                    wxJsonFee.put("wechat_fee_rate", WX_BUS_FEE_ID_MAP.get(this.wechatStlmRuleId));
                    // 微信结算规则ID
                    wxJsonFee.put("wechat_stlm_rule_id", this.wechatStlmRuleId);
                    // 商户类型
                    wxJsonFee.put("mcht_type", MchApplyment.MERCHANT_TYPE_PERSONAL == this.merchantType ? "05":MchApplyment.MERCHANT_TYPE_INDIVIDUAL == this.merchantType ? "02":"01" );

                    array.add(wxJsonFee);
                }

            });
        }
        return array;
    }

    /** 产品开通 **/
    public JSONObject productOpen() {
        JSONObject bussInfo = new JSONObject();
        List<PaywayFee> paywayFeeList = this.paywayFeeList;
        // 费率设置列表
        if (paywayFeeList != null && CollectionUtils.isNotEmpty(paywayFeeList)) {
            paywayFeeList.stream().forEach(item -> {
                // 阶梯费率
                if ((item.getWayCode().startsWith("YSF_") || item.getWayCode().startsWith("UP_")) && PaywayFee.FEE_TYPE_LEVEL.equals(item.getFeeType())) {
                    // 是否开通银联快捷
//                    bussInfo.put("is_open_fast_union", "1");
                    // 是否开通银联二维码
                    bussInfo.put("is_open_third_union", "1");
                }
                // 支付宝费率
                if (item.getWayCode().startsWith("ALI_") && PaywayFee.FEE_TYPE_SINGLE.equals(item.getFeeType())) {
                    // 是否开通支付宝二维码
                    bussInfo.put("is_open_third_alipay", "1");
                }

                // 微信费率
                if (item.getWayCode().startsWith("WX_") && PaywayFee.FEE_TYPE_SINGLE.equals(item.getFeeType())) {
                    // 是否开通微信二维码
                    bussInfo.put("is_open_third_wechat", "1");
                }
            });
        }
        return bussInfo;
    }



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


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