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.exception.BizException;
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 HmpayApplymentInfo extends ApplymentBasicInfo{

    public static String HM_MERCHANT_TYPE_GENERAL = "GENERAL_MERCHANT";
    public static String HM_MERCHANT_TYPE_PERSONAL = "PERSONAL_MERCHANT";

    /** 银行账户类型 PUBLIC_ACCOUNT-对公帐户 PRIVATE_DEBIT_ACCOUNT-对私借记卡 **/
    public static String HM_BANK_ACCOUNT_TYPE_PUBLIC = "PUBLIC_ACCOUNT";
    public static String HM_BANK_ACCOUNT_TYPE_PERSONAL = "PERSONAL_MERCHANT";

    /** 支付方式 WEIXIN：微信 ALIPAY：支付宝 UNION_PAY：银联支付SANDBAO：杉德宝 **/
    public static String HM_PAY_WAY_WEIXIN = "WEIXIN";
    public static String HM_PAY_WAY_ALIPAY = "ALIPAY";
    public static String HM_PAY_WAY_UNION_PAY = "UNION_PAY";
    public static String HM_PAY_WAY_SANDBAO = "SANDBAO";

    /** 商户类型 普通商户：GENERAL_MERCHANT 个人小微：PERSONAL_MERCHANT **/
    public String hmMerchantType;

    /** 小微经营类型 **/
    public String microBizType;

    /** 工商网截图  **/
    public String icNetScreenShot;

    /** 单位证明照  **/
    public String companyProveImgUrl;

    /** 企业性质 股份有限公司：STOCK_COMPANY 有限公司：LIMITED_COMPANY 个体工商户：INDIVIDUAL_BUSINESS 事业单位：GOVERNMENT_INSTITUTION 其他：OTHER **/
    public String enterpriseNature;

    /** 注册地址  **/
    public String registerAddress;

    /** 联系人类型  **/
    public String contactPersonType;

    /** 联系人身份证号  **/
    public String contactPersonIdCardNo;

    /** 法人性别 **/
    public String idcardSex;

    /** 联系人性别 **/
    public String contactPersonSex;

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

    /** 支付方式详情  **/
    public String payWayInfo;

    /** 租赁协议（小微使用） **/
    public String leaseAgreement;

    /** 其它补充图片 小微不能超过5个（目前租赁协议占了一个） 普通商户不能超过10个 **/
    public String otherPicUrl1;
    public String otherPicUrl2;
    public String otherPicUrl3;


    /** 商户类别 用于开通支付产品（支付宝和银联） **/
    public String mccTypeCode;
    /** 微信经营类目 开通微信支付时必填 **/
    public String wxMccCode;

    /*     绑卡信息       **/
    /** 银行账户类型 个人小微商户只能选择对私账户 PUBLIC_ACCOUNT：对公帐户 PRIVATE_DEBIT_ACCOUNT：对私借记卡 **/
    public String bankAccountType;
    /** 银行联行号 对公账户必填 **/
    public String bankChannelNo;
    /** 银行开户身份证号码 对私账户必填 **/
    public String bankAccountIdCardNo;
    /** 银行预留手机号 对私账户必填 **/
    public String bankAccountPhone;
    /** 商户换卡必填 换卡生效时间 **/
    public String validDate;


    /**
     * 分账计费模式
     **/
    public String feeType;

    public String convertIdCardStartEnd(String idcardEffectBegin, String idcardEffectEnd){
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("start_date", idcardEffectBegin);
        if ("长期".equals(this.getIdcardEffectEnd())) {
            jsonObject.put("end_date", "forever");
        }else {
            jsonObject.put("end_date", idcardEffectEnd);
        }
        return jsonObject.toString();
    }

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

    public String coverMcc(String mccCode) {
        if (StringUtils.isNotEmpty(mccCode)) {
            String[] split = mccCode.split("_");
            return split[1];
        }
        return null;
    }

    /** 支付方式开通（不包含费率信息） **/
    public String coverPayWayInfo() {
        JSONArray array = new JSONArray();
        if (StringUtils.isEmpty(this.mccTypeCode) && StringUtils.isEmpty(this.wxMccCode)) {
            throw new BizException("商户类别和微信经营类目不能同时为空！");
        }
        if (StringUtils.isNotEmpty(this.mccTypeCode)) {

            // 支付宝业务申请信息
            JSONObject aliJson = new JSONObject();
            aliJson.put("pay_way", HM_PAY_WAY_ALIPAY);
            aliJson.put("ali_mcc_category_code", coverMcc(this.mccTypeCode));
            array.add(aliJson);
            // 银联业务申请信息
            JSONObject unionJson = new JSONObject();
            unionJson.put("pay_way", HM_PAY_WAY_UNION_PAY);
            unionJson.put("union_mcc_category_code", coverMcc(this.mccTypeCode));
            array.add(unionJson);
        }

        if (StringUtils.isNotEmpty(this.wxMccCode)) {
            // 微信业务申请信息
            JSONObject wxJson = new JSONObject();
            wxJson.put("pay_way", HM_PAY_WAY_WEIXIN);
            wxJson.put("wechat_category_code", coverMcc(this.wxMccCode));
            array.add(wxJson);
        }
        return array.toJSONString();
    }

    public void coverOtherPicUrl(String otherPicUrl, JSONArray otherSupplyImgArray) {
        if (StringUtils.isNotEmpty(otherPicUrl)) {
            JSONObject paramJson = new JSONObject();
            paramJson.put("other_supply_img_url", otherPicUrl);
            otherSupplyImgArray.add(paramJson);
        }
    }

    /** 费率转换 **/
    public JSONObject convertApplymentPayFee() {
        JSONObject feeJsonObject = 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_")) {
                        feeJsonObject.put("wxRate", convertRate(item.getFeeRate()));
                    }
                    // 支付宝费率
                    if (item.getWayCode().startsWith("ALI_")) {
                        feeJsonObject.put("aliRate", convertRate(item.getFeeRate()));
                    }
                }

                // 阶梯费率
                if ((item.getWayCode().startsWith("YSF_") || item.getWayCode().startsWith("UP_")) && PaywayFee.FEE_TYPE_LEVEL.equals(item.getFeeType())) {
                    // 是否配了阶梯费率
                    feeJsonObject.put("jtSupport", "yes");
                    // 借记卡费率
                    if (CollUtil.isNotEmpty(item.getLevelList())) {
                        // 借记卡费率(≤1000元) 单位%
                        feeJsonObject.put("rate_one_debit", convertRate(item.getLevelList().get(0).getFeeRate()));
                        // 借记卡费率(>1000元)，单位%
                        feeJsonObject.put("rate_two_debit", convertRate(item.getLevelList().get(1).getFeeRate()));
                        // 借记卡费率封顶值(>1000元)，单位元
                        feeJsonObject.put("rate_two_debit_cap", AmountUtil.convertCent2Dollar(item.getMaxFee()));
                    }
                    // 贷记卡费率（信用卡）
                    if (item.getCreditCardPaywayFee() != null && CollUtil.isNotEmpty(item.getCreditCardPaywayFee().getLevelList())) {
                        // 贷记卡费率(≤1000元)，单位%
                        feeJsonObject.put("rate_one_credit", convertRate(item.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate()));
                        // 贷记卡费率(>1000元)，单位%
                        feeJsonObject.put("rate_two_credit", convertRate(item.getCreditCardPaywayFee().getLevelList().get(1).getFeeRate()));
                    }
                }
            });
        }
        return feeJsonObject;
    }

    // 0.6 表示0.6%
    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 bankChannelNo;
    }
}
