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

import cn.hutool.core.collection.CollUtil;
import com.jeequan.jeepay.core.constants.CS;
import com.jeequan.jeepay.core.entity.MchApplyment;
import com.jeequan.jeepay.core.model.params.utmpay.UtmpayConfig;
import com.jeequan.jeepay.core.utils.AmountUtil;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.*;

@Data
public class UtmpayApplymentInfo extends ApplymentBasicInfo{

    /** 客服电话 **/
    public String customerPhone;

    /** 企业法人【姓名】 **/
    public String legalPerson;

    /** 执照类型 00-统一社会信用代码证号(三证合一) 01-营业执照(非三证合一) 02-其他 **/
    public String businessLicenseType;

    /** 银行预留手机号 **/
    public String bankCardPhone;

    /** 结算信息 是否为负责人信息 **/
    public String isContactInfo;

    /** 联行行号 **/
    public String contactLine;

    /** 开户银行ID **/
    public String bankId;

    /** 商户协议照片1 **/
    public String protocolPhoto1;

    /** 商户协议照片2 **/
    public String protocolPhoto2;

    /** 商户协议照片3 **/
    public String protocolPhoto3;

    /** 商户协议照片4 **/
    public String protocolPhoto4;

    /** 组织机构代码证照片 **/
    public String orgPhoto;

    /** 其他资料照片 **/
    public String otherDoc;


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

        if(this.merchantType == null){
            return "";
        }

        if(this.merchantType == MchApplyment.MERCHANT_TYPE_INDIVIDUAL){
            return "1";
        }else if(this.merchantType == MchApplyment.MERCHANT_TYPE_ENTERPRISE){
            return "2";
        }
        return "";
    }

    /** 类型转换：标准格式 ---》 接口自定义格式 **/
    public String convertAccountType(){
        if(StringUtils.isBlank(this.settAccountType)){
            return "";
        }

        if(this.settAccountType.equals(MchApplyment.SETT_ACCOUNT_TYPE_CORPORATE)) {
            return "1";
        }else if(this.settAccountType.equals(MchApplyment.SETT_ACCOUNT_TYPE_PERSONAL)) {
            return "2";
        }
        return "";
    }

    /** 类型转换：标准格式 ---》 接口自定义格式 **/
    public static List<SortedMap<String, String>> convertPaywayFeeList(List<PaywayFee> paywayFeeList){

        // 签约产品不存在 && 不包含分账产品
        if(paywayFeeList == null) {
            return null;
        }

        List<SortedMap<String, String>> result = new LinkedList<>();

        // 签约收单产品 集合
        for (PaywayFee paywayFee : paywayFeeList) {

            SortedMap<String, String> mchPayConf = new TreeMap<>();

            // 第一步：
            // 支付类型（暂时写死），
            // 实际取值请联系技术支持获取，每个行不一样。可以通过管理平台"机构管理"->"机构进件管理"页面上的“机构支付类型配置信息”中查看。
            // 文档地址：https://up.95516.com/open/openapi/doc?index_1=127&index_2=1&chapter_1=1943&chapter_2=1945
            String payTypeId = UtmpayConfig.yplPayWayMap.get(paywayFee.getWayCode());

            // 不存在该支付类型
            if(StringUtils.isEmpty(payTypeId)){
                continue;
            }

            // 支付类型
            mchPayConf.put("wayCode", paywayFee.getWayCode());
            mchPayConf.put("payTypeId", payTypeId);

            // 单笔费率
            if(PaywayFee.FEE_TYPE_SINGLE.equals(paywayFee.getFeeType())){
                mchPayConf.put("billRate", convertRate(paywayFee.getFeeRate()));

                result.add(mchPayConf);
                continue;
            }

            // 以下为银联阶梯费率
            if(Arrays.asList(CS.PAY_WAY_CODE.UP_BAR, CS.PAY_WAY_CODE.UP_JSAPI, CS.PAY_WAY_CODE.UP_QR, CS.PAY_WAY_CODE.YSF_BAR, CS.PAY_WAY_CODE.YSF_JSAPI)
                    .contains(paywayFee.getWayCode())){

                // 借记卡费率
                if(CollUtil.isNotEmpty(paywayFee.getLevelList())){
                    mchPayConf.put("billRate1",convertRate(paywayFee.getLevelList().get(0).getFeeRate())); // 借记卡手续费费率（单笔交易≤1000元） 参数单位为‰
                    mchPayConf.put("billRate3",convertRate(paywayFee.getLevelList().get(1).getFeeRate())); // 借记卡手续费费率（单笔交易>1000元） 参数单位为‰
                    mchPayConf.put("debitCardBrokerageLimitBd", convertFee(paywayFee.getMaxFee())); // 借记卡手续费封顶  单位：元
                }

                // 信用卡费率
                if(paywayFee.getCreditCardPaywayFee() != null && CollUtil.isNotEmpty(paywayFee.getCreditCardPaywayFee().getLevelList())){
                    mchPayConf.put("billRate",convertRate(paywayFee.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate())); // 信用卡手续费费率 （单笔交易≤1000元） 参数单位为‰
                    mchPayConf.put("billRate2",convertRate(paywayFee.getCreditCardPaywayFee().getLevelList().get(1).getFeeRate())); // 信用卡手续费费率（单笔交易>1000元） 参数单位为‰
                }

            }

            result.add(mchPayConf);

        }

        return result;

    }

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

    private static String convertFee(Long fee){

        if(fee == null){
            return null;
        }

        return AmountUtil.convertCent2Dollar(fee);
    }

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