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 lombok.Data;
import org.apache.commons.collections4.CollectionUtils;

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

@Data
public class UmhspayApplymentInfo extends ApplymentBasicInfo {
    /** 商户手机号（商户登陆账号）唯一，不能重复 **/
    private String accountPhone;

    /** 店铺类型 1-主店；2-独立结算分店；3-合并结算分店；4-分账接收方 **/
    private Byte shopType;

    /** 总店商户号 **/
    private String shopMerchantId;

    /** 总-门店关系说明函(图片id),总分店同个营业执照必填 **/
    private String relationCertPic;

    /** 联系人类型：0-法人；1-委托人； **/
    private Byte contactType;

    /** 银行预留手机号 **/
    private String prePhone;

    /** 开户支行联行号 **/
    private String openBankCode;

    /* 分账相关所需上送内容 start ------------------------------------------------- **/
    /** 三方协议形式：1-纸质协议；2-电子协议 **/
    private Byte contractType;
    /** 商户收单主协议，传<图片上传>返回的对应file_id，格式为[1,2,3] 若该主商户历史有过成功的关联记录，或者三方协议形式为电签则可以不传； **/
    private String agrmPic;
    /** 三方分账授权协议，传<图片上传>返回的对应file_id，格式为[1,2,3] 如电签则不需要上传 **/
    private String shareAgrmPic;
    /** 商户分账服务开通申请登记表 格式为[1,2,3] **/
    private String supmtAgrmPic;
    /** 分账方和分账接收方之间的业务合作协议 格式为[1,2,3] **/
    private String copAgrmPic;

    /** 分账电签：商户签约人类型 **/
    private String merSignType;
    /** 分账电签：商户签约人手机号码 **/
    private String merSignPhone;
    /** 分账电签：商户经办人身份证人像面照片 **/
    private String merCardHeadsPic;
    /** 分账电签：商户经办人身份证国徽面照片 **/
    private String merCardTailsPic;
    /** 分账电签：商户经办人电签授权书 **/
    private String merContractAuth;
    /** 分账电签：商户签约人姓名 **/
    private String merSignName;
    /** 分账电签：商户签约人身份证号 **/
    private String merSignCard;

    /* 分账相关所需上送内容 end ------------------------------------------------- **/


    /** 结算账户类型  1-法人对私；2-非法人对私；3-法人对公；merchantType=1-小微，该参数必须为1-法人对私 **/
    public String convertAccountType() {
       if (MchApplyment.SETT_ACCOUNT_TYPE_PERSONAL.equals(this.getSettAccountType())) {
            return "1";
        }else if ("C2".equals(this.getSettAccountType())) {
            return "2";
        }else  if (MchApplyment.SETT_ACCOUNT_TYPE_CORPORATE.equals(this.getSettAccountType())) {
            return "3";
        }
        return "1";
    }

    /** 费率相关业务信息 **/
    public JSONArray convertApplymentPayFee() {
        // 微信业务申请信息
        JSONObject wxJson = new JSONObject();
        // 支付宝业务申请信息
        JSONObject aliJson = new JSONObject();
        // 云闪付1000以下（包含1000）
        JSONObject litYsfJson = new JSONObject();
        // 云闪付1000以上（不包含1000）
        JSONObject bigYsfJson = 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("transType", 1);
                        wxJson.put("merchantDefaultD1Rate", convertRate(item.getFeeRate()) + "");
                    }
                    // 支付宝费率
                    if (item.getWayCode().startsWith("ALI_")) {
                        aliJson.put("transType", 2);
                        aliJson.put("merchantDefaultD1Rate", 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元） 参数单位为‰
                        // 云闪付1000以下（包含1000）
                        litYsfJson.put("transType", 3);
                        // 商户签约费率(交易费率)，单位：%
                        litYsfJson.put("merchantDefaultD1Rate", convertRate(item.getLevelList().get(0).getFeeRate()) + "");

                        // 云闪付1000以上（不包含1000）
                        bigYsfJson.put("transType", 4);
                        // 商户签约费率(交易费率)，单位：%
                        bigYsfJson.put("merchantDefaultD1Rate", convertRate(item.getLevelList().get(1).getFeeRate()) + "");
                    }
                }
            });
        }

        JSONArray merchantFeeRateList = new JSONArray();
        if (!wxJson.isEmpty()){
            merchantFeeRateList.add(wxJson);
        }
        if (!aliJson.isEmpty()){
            merchantFeeRateList.add(aliJson);
        }
        if (!litYsfJson.isEmpty()){
            merchantFeeRateList.add(litYsfJson);
        }
        if (!bigYsfJson.isEmpty()){
            merchantFeeRateList.add(bigYsfJson);
        }

        return merchantFeeRateList;
    }


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

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