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

import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONObject;
import com.jeequan.jeepay.core.constants.CS;
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 YsfpayApplymentInfo extends ApplymentBasicInfo{

    /** 门店外景照 **/
    public String storeOuter2Img;

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

    /** 结算账户类型 1-对公 2-法人账户 3-授权人账户 **/
    public String settleAccountType;

    /** 结算周期 1-T+1 2-D+0 3-T+0 4-D+1 **/
    public String settlePeriod;

    /** 开户行联行号 **/
    public String openBankCode;

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

    /** 商户收单协议照 **/
    public String acquiringAgreementPhoto;

    /** 结算授权照 **/
    public String settleAuthLetterPhoto;

    /** 拓展材料 **/
    public String reserve1;

    /** 机构类型 **/
    public String acqOrgType;

    // 商户类型转换
    public String coverMerchantType() {
        Byte merchantType = this.merchantType;
        String merType = "";
        switch (merchantType) {
            case 1:{
                merType = "3";
                break;
            }
            case 2:{
                merType = "1";
                break;
            }
            case 3:{
                merType = "2";
                break;
            }
        }
        return merType;
    }

    // mcc转换
    public String coverMcc() {
        String[] mccCodeArr = this.mccCode.split("_");
        return mccCodeArr[1];
    }

    // 有效期转换
    public String coverDateTime(String dateStr) {
        if ("长期".equals(dateStr)) {
            return dateStr;
        }else {
            return dateStr.replace("-","");
        }
    }


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

        if(this.paywayFeeList == null){
            return null;
        }

        JSONObject result = new JSONObject();

        for (PaywayFee paywayFee : this.paywayFeeList) {

            // 第一步： 转换产品ID ( 本系统 --》 云闪付 )
            String bizProductCode = null;
            switch (paywayFee.getWayCode()){
                case CS.PAY_WAY_CODE.WX_BAR: bizProductCode = "feeRateWechatpay"; break;
                case CS.PAY_WAY_CODE.WX_JSAPI: bizProductCode = "feeRateWechatpay"; break;
                case CS.PAY_WAY_CODE.WX_H5: bizProductCode = "feeRateWechatpay"; break;
                case CS.PAY_WAY_CODE.WX_LITE: bizProductCode = "feeRateWechatpay"; break;
                case CS.PAY_WAY_CODE.WX_NATIVE: bizProductCode = "feeRateWechatpay"; break;
                case CS.PAY_WAY_CODE.ALI_BAR: bizProductCode = "feeRateAlipay"; break;
                case CS.PAY_WAY_CODE.ALI_JSAPI: bizProductCode = "feeRateAlipay"; break;
                case CS.PAY_WAY_CODE.ALI_LITE: bizProductCode = "feeRateAlipay"; break;
                case CS.PAY_WAY_CODE.ALI_PC: bizProductCode = "feeRateAlipay"; break;
                case CS.PAY_WAY_CODE.ALI_QR: bizProductCode = "feeRateAlipay"; break;
                case CS.PAY_WAY_CODE.ALI_WAP: bizProductCode = "feeRateAlipay"; break;
                case CS.PAY_WAY_CODE.YSF_BAR: bizProductCode = "rateConfig"; break;
            }
            // 云闪付不存在该产品
            if(StringUtils.isEmpty(bizProductCode)){
                continue;
            }

            // 云闪付费率
            if ("rateConfig".equals(bizProductCode)) {
                // 金额大于1000以上的费率
                JSONObject level1Json = new JSONObject();
                // 银联借记卡费率
                level1Json.put("feeRateUnionpayDebit", convertRate(paywayFee.getFeeRate()));
                // 借记卡封顶 0不封顶 瑞银信 18-80
                level1Json.put("feeRateUnionpayDebitCap", "8000");
                level1Json.put("feeRateUnionpayCredit", convertRate(paywayFee.getFeeRate()));
                result.put("bankCardRateLevel1", level1Json);
                // 金额小于1000以下的费率
                result.put("bankCardRateLevel2", level1Json);
                continue;
            }

            // 支付宝、微信 单笔费率
            if(PaywayFee.FEE_TYPE_SINGLE.equals(paywayFee.getFeeType())){
                // 产品编码
                result.put(bizProductCode, convertRate(paywayFee.getFeeRate()));
                continue;
            }

        }
        return result;

    }

    public JSONObject convertApplymentPayFee() {
        List<PaywayFee> paywayFeeList = this.paywayFeeList;
        JSONObject feeJson = new JSONObject();
        // 费率设置列表
        if (paywayFeeList != null && CollectionUtils.isNotEmpty(paywayFeeList)) {
            // 费率 【以下费率配置以瑞银信机构配置】 新机构不一致情况 可按机构类型区分
            paywayFeeList.stream().forEach(item -> {
                if (PaywayFee.FEE_TYPE_SINGLE.equals(item.getFeeType())) {
                    // 微信费率
                    if (item.getWayCode().startsWith("WX_")) {
                        feeJson.put("feeRateWechatpay", convertRate(item.getFeeRate()) + "");
                    }
                    // 支付宝费率
                    if (item.getWayCode().startsWith("ALI_")) {
                        feeJson.put("feeRateAlipay", convertRate(item.getFeeRate()) + "");
                    }
                }

                // 阶梯费率
                if (item.getWayCode().startsWith("YSF_") && PaywayFee.FEE_TYPE_LEVEL.equals(item.getFeeType())) {
                    //银行卡费率一档，交易金额大于 1000 元的费率
                    JSONObject bankCardRateLevel1 = new JSONObject();
                    //银行卡费率二档，交易金额小于 1000 元的费率
                    JSONObject bankCardRateLevel2 = new JSONObject();

                    // 借记卡费率
                    if(CollUtil.isNotEmpty(item.getLevelList())){
                        // 借记卡手续费费率（单笔交易≤1000元） 参数单位为‰
                        // 借记手续费
                        bankCardRateLevel2.put("feeRateUnionpayDebit", convertRate(item.getLevelList().get(0).getFeeRate()) + "");
                        // 借记封顶 分
                        bankCardRateLevel2.put("feeRateUnionpayDebitCap", "0");

                        // 借记卡手续费费率（单笔交易>1000元） 参数单位为‰
                        // 借记手续费
                        bankCardRateLevel1.put("feeRateUnionpayDebit", convertRate(item.getLevelList().get(1).getFeeRate()) + "");
                        // 借记封顶 分
                        bankCardRateLevel1.put("feeRateUnionpayDebitCap", item.getMaxFee()+"");
                    }

                    // 贷记卡费率
                    if(item.getCreditCardPaywayFee() != null && CollUtil.isNotEmpty(item.getCreditCardPaywayFee().getLevelList())){
                        // 贷记卡手续费费率 （单笔交易≤1000元） 参数单位为‰
                        bankCardRateLevel2.put("feeRateUnionpayCredit", convertRate(item.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate()) + "");

                        // 贷记卡手续费费率（单笔交易>1000元） 参数单位为‰
                        bankCardRateLevel1.put("feeRateUnionpayCredit", convertRate(item.getCreditCardPaywayFee().getLevelList().get(1).getFeeRate()) + "");
                    }

                    feeJson.put("bankCardRateLevel1", bankCardRateLevel1);
                    feeJson.put("bankCardRateLevel2", bankCardRateLevel2);
                }

            });
        }
        return feeJson;
    }


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

    public static void main(String[] args) {

        System.out.println(convertRate(new BigDecimal("0.0028")));
    }

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