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.easypay.EasypayIsvParams;
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 EasypayApplymentInfo 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 businessScope;
    /** 注册资本：单位-万元 **/
    public String capital;
    /** 开户行行号（对于easypay来说，和联行号值相同） **/
    public String bankCode;
    /** 开户行行号（对于easypay来说，和联行号值相同）企业且对公 **/
//    public String companyBankCode;
    /** 法人手机号 **/
    public String legalPhone;
    /** 结算人手机号 **/
    public String settAccountPhone;
    /** 控股股东或实际控制人姓名或名称 **/
    public String controlerName;
    /** 控股股东或实际控制人证件号码 **/
    public String controlerLegalCode;
     /** 控股股东或实际控制人证件有效期 **/
    public String controlerLegalValidityBegin;
    public String controlerLegalValidityEnd;
    /** 是否结算到法人 **/
    public byte ifSettToLegal;
    /** 持卡人手持银行卡照片 **/
    public String settAccountByHandImg;


    /** 门牌号照片 **/
    public String houseNumImg;
    /** 定位照 **/
    public String locationImg;
    /** 协议照片 **/
    public String agreementImg;
    /** 清算授权书照片 **/
    public String stlAuthImg;

    /** 到账方式 01 T1, 02 D1, 03 D0 **/
    public String settleWay;

    /**
     *  商户类型 0-企业 1-个体户 2-小微
     */
    public String convertMerchantType(){
        if(this.merchantType == MchApplyment.MERCHANT_TYPE_PERSONAL){
            return "2";
        }else if(this.merchantType == MchApplyment.MERCHANT_TYPE_INDIVIDUAL){
            return "1";
        }else if(this.merchantType == MchApplyment.MERCHANT_TYPE_ENTERPRISE){
            return "0";
        }
        return "";
    }

    /** 截止日期转换 **/
    public String convertDate(String startDateStr, String endDateStr) {
        if ("长期".equals(endDateStr)) {
            endDateStr = "9999.99.99";
        } else {
            endDateStr = endDateStr.replace("-", ".");
        }
        startDateStr = startDateStr.replace("-", ".");
        JSONArray array = new JSONArray();
        array.add(startDateStr);
        array.add(endDateStr);
        return array.toJSONString();
    }


    /** 结算账户类型  00-个人；10-对公 **/
    public String convertAccountType() {
        if (MchApplyment.SETT_ACCOUNT_TYPE_CORPORATE.equals(this.getSettAccountType())) {
            return "10";
        }else if (MchApplyment.SETT_ACCOUNT_TYPE_PERSONAL.equals(this.getSettAccountType())) {
            return "00";
        }
        // 小微商户默认结算到个人
        return "00";
    }

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

    public void convertApplymentPayFee(EasypayIsvParams isvParams, JSONArray funcInfo) {
        // 微信业务申请信息
        JSONObject wxJson = new JSONObject();
        // 支付宝业务申请信息
        JSONObject aliJson = new JSONObject();
        // 银行卡/银联二维码业务申请信息 标准类 >1000
        JSONObject bankJson = new JSONObject();
        // 银行卡/银联二维码业务申请信息 营销类 <1000
        JSONObject bankLowJson = 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("funcId", "3");
                        wxJson.put("calcVal", convertRate(item.getFeeRate()) + "");
                    }
                    // 支付宝费率
                    if (item.getWayCode().startsWith("ALI_")) {
                        aliJson.put("funcId", "2");
                        aliJson.put("calcVal", convertRate(item.getFeeRate()) + "");
                        if (StringUtils.isNotEmpty(isvParams.getAliAppId())){
                            aliJson.put("appid", isvParams.getAliAppId());
                        }
                    }
                }

                // 阶梯费率
                if ((item.getWayCode().startsWith("YSF_") || item.getWayCode().startsWith("UP_")) && PaywayFee.FEE_TYPE_LEVEL.equals(item.getFeeType())) {

                    // 借记卡费率
                    if (CollUtil.isNotEmpty(item.getLevelList())) {
                        // 14 营销类<1000
                        bankLowJson.put("funcId", "14");
                        // 12 标准类>1000
                        bankJson.put("funcId", "12");
                        // 借记卡手续费最低值（单位：元） 营销类
                        bankLowJson.put("DFeeLowLimit", AmountUtil.convertCent2DollarShort(item.getMinFee()+""));
                        // 借记卡手续费最低值（单位：元） 标准类
                        bankJson.put("DFeeLowLimit", AmountUtil.convertCent2DollarShort(item.getMinFee()+""));
                        // 银行卡借记卡费率 单位为% 营销类
                        bankLowJson.put("DCalcVal", convertRate(item.getLevelList().get(0).getFeeRate()) + "");
                        // 银行卡借记卡费率 单位为% 标准类
                        bankJson.put("DCalcVal", convertRate(item.getLevelList().get(1).getFeeRate()) + "");
                        // 银行卡借记卡手续费封顶
                        if (StringUtils.isEmpty(item.getMaxFee().toString())){
                            // 借记卡扣率方式 :1-封顶;0-不封顶  营销类
                            bankLowJson.put("DStlmType", "0");
                            // 借记卡扣率方式 :1-封顶;0-不封顶  标准类
                            bankJson.put("DStlmType", "0");
                        } else {
                            bankLowJson.put("DStlmType", "1");
                            bankJson.put("DStlmType", "1");
                            // 借记卡封顶金额（单位：元）,借记卡扣率方式封顶时必填 营销类
                            bankLowJson.put("DStlmMaxAmt", AmountUtil.convertCent2DollarShort(item.getMaxFee()+""));
                            // 借记卡封顶金额（单位：元）,借记卡扣率方式封顶时必填 标准类
                            bankJson.put("DStlmMaxAmt", AmountUtil.convertCent2DollarShort(item.getMaxFee()+""));
                        }
                    }
                    // 贷记卡费率（信用卡）
                    if (item.getCreditCardPaywayFee() != null && CollUtil.isNotEmpty(item.getCreditCardPaywayFee().getLevelList())) {
                        // 信用卡扣率（单位：%） 营销类<1000
                        bankLowJson.put("CCalcVal", convertRate(item.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate()) + "");
                        // 信用卡扣率（单位：%） 标准类>1000
                        bankJson.put("CCalcVal", convertRate(item.getCreditCardPaywayFee().getLevelList().get(1).getFeeRate()) + "");
                        // 信用卡手续费最低值（单位：元） 营销类
                        bankLowJson.put("CFeeLowLimit", AmountUtil.convertCent2DollarShort(item.getMinFee()+""));
                        // 信用卡手续费最低值（单位：元） 标准类
                        bankJson.put("CFeeLowLimit", AmountUtil.convertCent2DollarShort(item.getMinFee()+""));
                    }
                }
            });
        }

        if (wxJson.size() != 0){
            funcInfo.add(wxJson);
        }
        if (aliJson.size() != 0){
            funcInfo.add(aliJson);
        }
        if (bankJson.size() != 0){
            funcInfo.add(bankJson);
        }
        if (bankLowJson.size() != 0){
            funcInfo.add(bankLowJson);
        }
    }


    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 bankCode;
    }
}
