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

import cn.hutool.core.collection.CollUtil;
import com.jeequan.jeepay.core.entity.MchApplyment;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.List;
import java.util.TreeMap;

@Data
public class TerpayApplymentInfo extends ApplymentBasicInfo {

    /** 手机号 登入账号custLogin（手机号） 必须保持一致 **/
    public String mobileNo;

    /** 经营类型01 门店场所 02流动经营/便民服务 03线上商品/服务交易 **/
    public String manageType;

    /** 开户行(缩写) **/
    public String headBankNo;

    /** 开户支行信息 **/
    public String openBankMsg;

    //******费率信息**********


    //******其他信息**********

    /** 时间戳 用于同一批次图片上传 **/
    public String timestamp;

    /** 补充材料3 （手持结算卡照片） 结算类型为非法人时必传 **/
    public String filed3;
    public String filed2;
    public String filed5;

    /** 结算姓名 **/
    public String stlName;
    /** 非法人对私上传的授权书  结算类型为非法人时必传 **/
    public String stlAuth;
    /** 结算人站门头照 **/
    public String stlDoor;
    /** 非法人授权结算书 **/
    public String authCert;



    /** 验证码（需要签署安心签才需传） **/
    public String checkCode;

    /** 是否走第一次进件 目的：安心签签署失败可以不用放弃当前申请单 **/
    public String ifFirstApply;



    /**
     * merchantType: 1-个人  2-个体  3-企业
     *  1：个体工商户（普通） 2：企业（普通）3：小微
     * 商户类型转换 00:小微 ，01 普通（主体类型 1个体工商户 2企业 3政府及事业单位 5其他机构组织）
     */
    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;
            }
            default:
                merType = "3";
        }
        return merType;
    }

    /** 结算账户类型  01 对公 02法人对私 03非法人对私**/
    public String convertAccountType() {
        if (MchApplyment.SETT_ACCOUNT_TYPE_CORPORATE.equals(this.getSettAccountType())) {
            return "01";
        }else if (MchApplyment.SETT_ACCOUNT_TYPE_PERSONAL.equals(this.getSettAccountType())) {
            return "02";
        }else if ("C2".equals(this.getSettAccountType())) {
            return "03";
        }
        return "";
    }

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

    // 开户支行信息转换  例：四平市古城农村信用合作社_401243301421
    public String[] coverBranchBankMsg(String openBankMsg) {
        if (StringUtils.isEmpty(openBankMsg)) {
            return null;
        } else {
            return openBankMsg.split("_");
        }
    }

    public void convertApplymentPayFee(TreeMap<String, String> paperJson) {
        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_")) {
                        paperJson.put("rateWx", convertRate(item.getFeeRate()) + "");
                    }
                    // 支付宝费率
                    if (item.getWayCode().startsWith("ALI_")) {
                        paperJson.put("rateZfb", 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元） 参数单位为%
                        paperJson.put("rateYlCap0", convertRate(item.getLevelList().get(0).getFeeRate()) + "");
                        // 借记卡优惠类结算费率
                        paperJson.put("ratePosJy",  convertRate(item.getLevelList().get(1).getFeeRate()) + "");
                        // 借记卡手续费费率（单笔交易>1000元） 参数单位为‰
                        paperJson.put("rateYlCap1", convertRate(item.getLevelList().get(1).getFeeRate()) + "");
                        // 借记卡标准类结算费率（%）
                        paperJson.put("ratePosJb", convertRate(item.getLevelList().get(1).getFeeRate()) + "");
                        // 借记卡优惠类消费封顶值(分)
                        paperJson.put("moneyPosJy", item.getMaxFee().toString() + "");
                        // 借记卡标准类消费封顶值(分)
                        paperJson.put("moneyPosJb", item.getMaxFee().toString() + "");

                    }
                    // 贷记卡费率
                    if (item.getCreditCardPaywayFee() != null && CollUtil.isNotEmpty(item.getCreditCardPaywayFee().getLevelList())) {
                        // 贷记卡手续费费率（单笔交易<1000元） 参数单位为‰
                        paperJson.put("rateYlRat0", convertRate(item.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate()) + "");
                        // 贷记卡优惠类结算费率（%）
                        paperJson.put("ratePosDy", convertRate(item.getCreditCardPaywayFee().getLevelList().get(1).getFeeRate()) + "");
                        // 贷记卡手续费费率（单笔交易>1000元） 参数单位为‰
                        paperJson.put("rateYlRat1", convertRate(item.getCreditCardPaywayFee().getLevelList().get(1).getFeeRate()) + "");
                        // 贷记卡标准类结算费率（%）
                        paperJson.put("ratePosDb", convertRate(item.getCreditCardPaywayFee().getLevelList().get(1).getFeeRate()) + "");
                    }
                }
            });
        }
    }


    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() {
        String[] strings = coverBranchBankMsg(openBankMsg);
        if (strings == null) {
            return null;
        } else {
            return strings[1];
        }
    }
}
