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.model.params.hkpay.HkpayIsvParams;
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 HkpayApplymentInfo extends ApplymentBasicInfo {
    public static final String SETTLE_WAY_T1 = "01";
    public static final String SETTLE_WAY_D1 = "02";
    public static final String SETTLE_WAY_D0 = "03";

    /** 门店名称(商户门头名称) **/
    public String shopName;

    /** 结算账户清算行号（对于hkpay来说，和行联号值相同） **/
    public String bankCode;

    /** 预留手机号 **/
    public String prePhone;

    /** 是否结算到法人 **/
    public byte ifSettToLegal ;

    /** 营业执照所在地省市县编码 (包含省市县三级编码) **/
    public JSONArray licenseAreaCode;

    /** 第二张营业场所室内照图片 **/
    public String storeInner2Img;

    /** 非法人&对私 结算授权函图片 **/
    public String stlAuthImg;

    /** 非法人&对私 法人手持结算授权函合影图片 **/
    public String legalHandStlAuthImg;

    /** 结算周期 01 T1, 02 D1, 03 D0 **/
    public String settleWay;


    /**
     *  商户类型 10A:个体工商户  10B:企业  10C:小微商户
     */
    public String convertMerchantType(){
        if(this.merchantType == MchApplyment.MERCHANT_TYPE_PERSONAL){
            return "10C";
        }else if(this.merchantType == MchApplyment.MERCHANT_TYPE_INDIVIDUAL){
            return "10A";
        }else if(this.merchantType == MchApplyment.MERCHANT_TYPE_ENTERPRISE){
            return "10B";
        }
        return "";
    }


    /** 结算账户类型  10A：对公 10B：对私 **/
    public String convertAccountType() {
        if (MchApplyment.SETT_ACCOUNT_TYPE_CORPORATE.equals(this.getSettAccountType())) {
            return "10A";
        }else if (MchApplyment.SETT_ACCOUNT_TYPE_PERSONAL.equals(this.getSettAccountType())) {
            return "10B";
        }
        return "";
    }

    /** mcc转换 **/
    public String convertMcc() {
        if (StringUtils.isNotEmpty(this.mccCode)) {
            String[] code = this.mccCode.split("_");
            return code[1];
        }
        return null;
    }


    public JSONObject convertApplymentPayFee(HkpayIsvParams isvParams) {
        // 微信业务申请信息
        JSONObject wxJson = new JSONObject();
        // 支付宝业务申请信息
        JSONObject aliJson = new JSONObject();
        // 银行卡/银联二维码业务申请信息
        JSONObject bankJson = 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())) {
                    // 微信费率
                    if (item.getWayCode().startsWith("WX_")) {
                        wxJson.put("channel_no", isvParams.getChannelNoWx());
                        wxJson.put("rate", convertRate(item.getFeeRate()) + "");
                    }
                    // 支付宝费率
                    if (item.getWayCode().startsWith("ALI_")) {
                        aliJson.put("channel_no", isvParams.getChannelNoAli());
                        aliJson.put("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())) {
                        // 借记卡手续费费率（单笔交易≤1000元） 参数单位为‰
                        // 银行卡借记卡费率
//                        bankJson.put("bank_debit_rate", convertRate(item.getLevelList().get(0).getFeeRate()) + "");
                        // 银行卡借记卡手续费封顶
//                        bankJson.put("bank_debit_max", item.getMaxFee().toString() + "");
                        // 银联二维码借记卡费率
                        bankJson.put("union_debit_rate", convertRate(item.getLevelList().get(1).getFeeRate()) + "");
                        // 银联二维码借记卡手续费封顶
                        bankJson.put("union_debit_max", item.getMaxFee().toString() + "");

                    }
                    // 贷记卡费率
                    if (item.getCreditCardPaywayFee() != null && CollUtil.isNotEmpty(item.getCreditCardPaywayFee().getLevelList())) {
                        // 银行卡贷记卡费率
//                        bankJson.put("bank_credit_rate", convertRate(item.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate()) + "");
                        // 银联二维码贷记卡费率
                        bankJson.put("union_credit_rate", convertRate(item.getCreditCardPaywayFee().getLevelList().get(1).getFeeRate()) + "");
                        // 银联二维码1000以下包括1000费率值
                        bankJson.put("union_mix_rate", convertRate(item.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate()) + "");
                    }

                }
            });
        }
        JSONObject productData = new JSONObject();
        if (!wxJson.isEmpty()){
            productData.put("wx", wxJson);
        }
        if (!aliJson.isEmpty()){
            productData.put("ali", aliJson);
        }
        if (!bankJson.isEmpty()){
            productData.put("bank", bankJson);
        }

        return productData;
    }


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

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