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

import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONObject;
import com.jeequan.jeepay.core.entity.MchApplyment;
import com.jeequan.jeepay.core.exception.BizException;
import com.jeequan.jeepay.core.utils.AmountUtil;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

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

@Data
public class VbillpayApplymentInfo extends ApplymentBasicInfo{

    /** 经营类型：01-线下  02-线上 */
    private String operationalType;

    /** 线上产品类型：01-APP  02-网站  03-公众号/小程序/服务窗 */
    private String onlineType;

    /** APP名称/网站网址/公众号/小程序/服务窗名称 */
    private String onlineName;

    /** 营业执照注册名称 */
    private String cprRegNmCn;

    /** 是否三证合一 ：00-是  01-否  */
    private String licenseMatch;

    /** 组织机构代码证照片  */
    private String orgCodePic;

    /** 组织机构代码  */
    private String orgCode;

    /** 税务登记证照片  */
    private String taxRegistLicensePic;

    /** 税务登记号  */
    private String taxRegNo;

    /** 结算类型：03-T1结算  04-D1结算  */
    private String settleType;

    /** 联行号 */
    private String branchCode;

    /** ICP许可证或公众号主体信息截图照片地址 */
    private String icpLicence;

    /** 授权函照片地址 */
    private String letterOfAuthPic;

    /** 结算账户性质 1-法人 2-非法人 **/
    public Byte accountNature;

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

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

        if(this.merchantType == MchApplyment.MERCHANT_TYPE_PERSONAL){
            return "01";
        }else if(this.merchantType == MchApplyment.MERCHANT_TYPE_INDIVIDUAL){
            return "02";
        }else if(this.merchantType == MchApplyment.MERCHANT_TYPE_ENTERPRISE){
            return "03";
        }
        return "";
    }

    /** 类型转换：标准格式 ---》 接口自定义格式 **/
    public String convertLicenseEffectEnd(){
        return DATE_FOREVER_VAL.equals(this.licenseEffectEnd) ? "29991231" : formatVbillDate(this.licenseEffectEnd); // 盛付通 长期需要传入： 2199-12-31
    }

    /** 类型转换：标准格式 ---》 接口自定义格式 **/
    public String convertIdcardEffectEnd(){
        return DATE_FOREVER_VAL.equals(this.idcardEffectEnd) ? "29991231" : formatVbillDate(this.idcardEffectEnd); // 盛付通 长期需要传入： 2199-12-31
    }

    /** 类型转换：标准格式 ---》 接口自定义格式 **/
    public String convertSettAccountIdcardEffectEnd(){
        return DATE_FOREVER_VAL.equals(this.settAccountIdcardEffectEnd) ? "29991231" : formatVbillDate(this.settAccountIdcardEffectEnd); // 盛付通 长期需要传入： 2199-12-31
    }

    /** 类型转换：结算账户类型 **/
    public String covertSettAccountType() {
        if(StringUtils.isBlank(this.settAccountType)){
            return null;
        }

        if(this.settAccountType.equals(MchApplyment.SETT_ACCOUNT_TYPE_PERSONAL)){
            return "01";
        }else if(this.settAccountType.equals(MchApplyment.SETT_ACCOUNT_TYPE_CORPORATE)){
            return "00";
        }
        return "";
    }

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

        // 费率不存在
        if(this.paywayFeeList == null){
            return null;
        }

        // 二维码费率(%)
        List<JSONObject> qrcodeList = new ArrayList<>();

        // 签约收单产品 集合
        for (PaywayFee paywayFee : this.paywayFeeList) {

            JSONObject qrcodeRateJSON = new JSONObject(); // 二维码费率

            // 二维码费率：
            // 01 微信费率
            // 02 支付宝费率
            // 06 银联单笔小于等于1000费率
            // 07 银联单笔大于1000费率

            // 微信、支付宝 单笔费率
            if(PaywayFee.FEE_TYPE_SINGLE.equals(paywayFee.getFeeType())){
                if (paywayFee.getWayCode().startsWith("WX_")) {

                    // 去重，否则接口会报错
                    if (qrcodeList.stream().anyMatch(item -> "01".equals(item.getString("rateType")))) {
                        continue;
                    }

                    qrcodeRateJSON.put("rateType", "01");
                    qrcodeRateJSON.put("rate", convertRate(paywayFee.getFeeRate()));
                    qrcodeList.add(qrcodeRateJSON);

                }else if (paywayFee.getWayCode().startsWith("ALI_")) {

                    // 去重，否则接口会报错
                    if (qrcodeList.stream().anyMatch(item -> "02".equals(item.getString("rateType")))) {
                        continue;
                    }

                    qrcodeRateJSON.put("rateType", "02");
                    qrcodeRateJSON.put("rate", convertRate(paywayFee.getFeeRate()));
                    qrcodeList.add(qrcodeRateJSON);

                }
            }
            // 银联阶梯费率
            else if (PaywayFee.FEE_TYPE_LEVEL.equals(paywayFee.getFeeType()) && paywayFee.getWayCode().startsWith("UP_")) {

                // 借记卡
                List<PaywayFee> levelList = paywayFee.getLevelList();
                if(levelList == null && paywayFee.getCreditCardPaywayFee() != null){
                    levelList = paywayFee.getCreditCardPaywayFee().getLevelList();
                }
                if (CollUtil.isEmpty(levelList) || levelList.size() != 2) {
                    throw new BizException("请配置银联阶梯费率！");
                }

                // 去重，否则接口会报错
                if (qrcodeList.stream().anyMatch(item -> "06".equals(item.getString("rateType")) || "07".equals(item.getString("rateType")))) {
                    continue;
                }
                PaywayFee feeItem = levelList.get(0);
                JSONObject qrcodeRate = new JSONObject(); // 二维码费率
                qrcodeRate.put("rateType", "06");
                qrcodeRate.put("rate", convertRate(feeItem.getFeeRate()));
                qrcodeList.add(qrcodeRate);

                PaywayFee feeItem1 = levelList.get(1);
                JSONObject qrcodeRate2 = new JSONObject(); // 二维码费率
                qrcodeRate2.put("rateType", "07");
                qrcodeRate2.put("rate", convertRate(feeItem1.getFeeRate()));
                qrcodeList.add(qrcodeRate2);

            }
        }

        return qrcodeList;
    }

    /** 类型转换：标准格式 ---》 接口自定义格式 **/
    public List<JSONObject> convertBankCardRates() {
        // 费率不存在
        if(this.paywayFeeList == null){
            return null;
        }

        // 刷卡费率(%)
        List<JSONObject> bankCardRates = new ArrayList<>();

        // 费率集合
        for (PaywayFee paywayFee : this.paywayFeeList) {

            // 刷卡费率：
            // 21 贷记卡费率，不传默认0.60
            // 22 借记卡费率，不传默认0.55
            // 23 借记卡手续费封顶值，不传默认25
            // 24 云闪付贷记卡费率，不传默认银联二维码1000以上贷记卡费率
            // 25 云闪付的借记卡费率，不传默认银联二维码1000以上贷记卡费率

            // 银联阶梯费率
            if (PaywayFee.FEE_TYPE_LEVEL.equals(paywayFee.getFeeType()) && paywayFee.getWayCode().startsWith("UP_")) {

                // 借记卡
                List<PaywayFee> levelList = paywayFee.getLevelList();
                if (CollUtil.isNotEmpty(levelList)) {
                    for (PaywayFee feeItem : levelList) {
                        // 去重，否则接口会报错
                        if (bankCardRates.stream().anyMatch(item -> "22".equals(item.getString("type")))) {
                            continue;
                        }

                        JSONObject bankCardRate = new JSONObject(); // 刷卡费率
                        bankCardRate.put("type", "22");
                        bankCardRate.put("rate", convertRate(feeItem.getFeeRate()));
                        bankCardRates.add(bankCardRate);

                        JSONObject bankCardRate2 = new JSONObject(); // 刷卡费率
                        bankCardRate2.put("type", "23");
                        bankCardRate2.put("rate", AmountUtil.convertCent2Dollar(paywayFee.getMaxFee()));
                        bankCardRates.add(bankCardRate2);
                    }
                }

                if(paywayFee.getCreditCardPaywayFee() != null && CollUtil.isNotEmpty(paywayFee.getCreditCardPaywayFee().getLevelList())){
                    for (PaywayFee feeItem : paywayFee.getCreditCardPaywayFee().getLevelList()) {
                        // 去重，否则接口会报错
                        if (bankCardRates.stream().anyMatch(item -> "21".equals(item.getString("type")))) {
                            continue;
                        }

                        JSONObject bankCardRate = new JSONObject(); // 刷卡费率
                        bankCardRate.put("type", "21");
                        bankCardRate.put("rate", convertRate(feeItem.getFeeRate()));
                        bankCardRates.add(bankCardRate);
                    }
                }
            }
        }

        return bankCardRates;
    }

    /** 费率转换 */
    private String convertRate(BigDecimal rate){
        return rate == null ? null : rate.multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).toString();
    }

    /** 日期转换，去掉横线 */
    public String formatVbillDate(String date) {
        if (StringUtils.isBlank(date)) {
            return null;
        }

        return date.replaceAll("-", "");
    }

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