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

import com.alibaba.fastjson.annotation.JSONField;
import com.jeequan.jeepay.core.constants.CS;
import com.jeequan.jeepay.core.entity.MchApplyment;
import com.jeequan.jeepay.core.exception.BizException;
import lombok.Data;
import org.springframework.util.Assert;

import java.math.BigDecimal;
import java.util.*;

@Data
public class SxfpayApplymentInfo extends ApplymentBasicInfo {

    /**
     * 签购单名称，不传则与商户简称保持一致
     */
    private String merName;

    /**
     * 商户简称，使用 mchShortName
     */
    @JSONField(serialize = false)
    public String getMecDisNm() {
        return mchShortName;
    }

    /**
     * 商户联系手机号，使用 contactPhone
     */
    @JSONField(serialize = false)
    public String getMblNo() {
        return contactPhone;
    }

    /**
     * 经营类型，枚举值
     * 01 线下
     * 02 线上
     * 03 非盈利类
     * 04 缴费类
     * 05 保险类
     * 06 私立院校
     */
    private String operationalType;

    /**
     * 通过商户类型 merchantType来判断
     */
//    private String haveLicenseNo;

    /**
     * 资质类型，枚举值
     * 取值范围：
     * 01 自然人
     * 02 个体户
     * 03 企业
     * 04 政府机关
     * 05 事业单位
     * 06 其他组织
     * mecTypeFlag=01（连锁总店）或03（1+N总店）时，此处不能选自然人；
     * mecTypeFlag=04（1+n分店）时仅能选自然人；
     * 线上商户需选择03企业/04政府机关/05事业单位/06其他组织；
     */
    @JSONField(serialize = false)
    public String getHaveLicenseNo() {
        if (merchantType == MchApplyment.MERCHANT_TYPE_PERSONAL) {
            return "01";
        }

        if (merchantType == MchApplyment.MERCHANT_TYPE_INDIVIDUAL) {
            return "02";
        }

        if (merchantType == MchApplyment.MERCHANT_TYPE_ENTERPRISE) {
            return "03";
        }

        throw new BizException("未知的资质类型");
    }

    /**
     * 商户类型，枚举值
     * 取值范围：
     * 00 普通单店商户, 默认使用该值
     * 01 连锁总店
     * 02 连锁分店
     * 03 1+N总店
     * 04 1+N分店
     * mecTypeFlag == 02（连锁分店）时需校验所属总店mecTypeFlag必须为01 连锁总店，
     * mecTypeFlag == 04（1+n分店）时需校验所属总店mecTypeFlag必须为03 1+n总店;
     */
    private String mecTypeFlag;

    /**
     * 所属总店商户编号，当mecTypeFlag==04 时必传
     */
    private String parentMno;

    /**
     * 连锁分店是否独立结算，枚举值
     * 取值范围：
     * 00 独立结算
     * 01 非独立结算
     * 商户类型(mecTypeFlag==02)连锁分店时必传此参数；其他情况传入无效
     */
    private String independentModel;

    /**
     * 线上产品类型，枚举值
     * 取值范围：
     * 01 APP
     * 02 网站
     * 03 公众号/小程序/服务窗
     * 经营类型为线上(operationalType=='02')时，本字段必填
     */
    private String onlineType;

    /**
     * APP名称/网站网址/公众号/小程序/服务窗名称
     * 经营类型为线上(operationalType=='02')时，本字段必填
     */
    private String onlineName;

    /**
     * APP/网站/公众号/小程序/服务窗下载地址及账号信息
     */
    private String onlineTypeInfo;

    /**
     * 使用areaCode
     * 注册地址省编码
     * 需要与营业执照照面一致；
     * 省、市、区编码、街道地址（四个参数需同时上传）
     */
    @JSONField(serialize = false)
    public String getProvCd() {
        if (areaCode.isEmpty()) {
            throw new BizException("地区编码不能为空");
        }

        return areaCode.getString(0);
    }

    /**
     * 使用areaCode
     * 注册地址市编码
     * 需要与营业执照照面一致；
     * 省、市、区编码、街道地址（四个参数需同时上传）
     */
    @JSONField(serialize = false)
    public String getCityCd() {
        if (areaCode.size() < 2) {
            throw new BizException("地区市编码不能为空");
        }

        return areaCode.getString(1);
    }

    /**
     * 使用areaCode
     * 注册地址区编码
     * 需要与营业执照照面一致；
     * 省、市、区编码、街道地址（四个参数需同时上传）
     */
    @JSONField(serialize = false)
    public String getDistCd() {
        if (areaCode.size() < 3) {
            throw new BizException("地区区编码不能为空");
        }

        return areaCode.getString(2);
    }

    /**
     * 使用address
     * 注册地址街道地址
     * 直接填写详细街道门牌号即可；
     * 省、市、区编码、街道地址（四个参数需同时上传）
     */
    @JSONField(serialize = false)
    public String getDetailAddress() {
        return address;
    }

    /**
     * 使用address
     * 商户实际经营详细地址
     * 直接填写详细街道门牌号即可
     */
    @JSONField(serialize = false)
    public String getCprRegAddr() {
        return address;
    }

    /**
     * 使用areaCode
     * 实际经营地址省编码
     */
    @JSONField(serialize = false)
    public String getRegProvCd() {
        if (areaCode.isEmpty()) {
            throw new BizException("地区编码不能为空");
        }

        return areaCode.getString(0);
    }

    /**
     * 使用areaCode
     * 实际经营地址市编码
     */
    @JSONField(serialize = false)
    public String getRegCityCd() {
        if (areaCode.size() < 2) {
            throw new BizException("地区市编码不能为空");
        }

        return areaCode.getString(1);
    }

    /**
     * 使用areaCode
     * 实际经营地址区编码
     */
    @JSONField(serialize = false)
    public String getRegDistCd() {
        if (areaCode.size() < 3) {
            throw new BizException("地区区编码不能为空");
        }

        return areaCode.getString(2);
    }

    /**
     * 使用mccCode
     * 经营类目MCC
     * 请选择正确MCC入网。
     * 参加AT活动（蓝海/微信智慧餐饮/微信高校食堂）的商户，为确保报名成功，请按照上游要求(详见活动报名接口)的MCC进件。
     */
    @JSONField(serialize = false)
    public String getMccCd() {
        return mccCode;
    }

    /**
     * 客服电话
     * 纯数字
     */
    @JSONField(serialize = false)
    public String getCsTelNo() {
        return contactPhone;
    }

    /**
     * 邮箱
     * 此字段将上送至微信、支付宝
     */
    private String email;

    /**
     * 二维码费率(%)
     * rateType 枚举值，取值范围：
     * <p>
     * 同时上送以下四个枚举值;
     * 01 微信费率
     * 02 支付宝费率
     * 06 银联单笔小于等于1000费率
     * 07 银联单笔大于1000费率
     * <p>
     * 或同时上送以下七个枚举值;
     * 01 微信费率
     * 02 支付宝费率
     * 06 银联单笔小于1000贷记卡费率
     * 061 银联单笔小于1000借记卡费率
     * 07 银联单笔大于1000贷记卡费率
     * 071 银联单笔大于1000借记卡费率
     * 072 银联单笔大于1000借记卡封顶手续费
     * <p>
     * 或同时上送以下十一个枚举值
     * 01 微信贷记卡费率
     * 011微信借记卡费率
     * 012微信借记卡封顶手续费
     * 02 支付宝贷记卡费率
     * 021 支付宝借记卡费率
     * 022 支付宝借记卡封顶手续费
     * 06 银联单笔小于1000贷记卡费率
     * 061 银联单笔小于1000借记卡费率
     * 07 银联单笔大于1000贷记卡费率
     * 071 银联单笔大于1000借记卡费率
     * 072 银联单笔大于1000借记卡封顶手续费
     * <p>
     * 或同时上送以下十四个枚举值
     * 01 微信贷记卡费率
     * 011微信借记卡费率
     * 012微信借记卡封顶手续费
     * 02 支付宝贷记卡费率
     * 021 支付宝借记卡费率
     * 022 支付宝借记卡封顶手续费
     * 03 翼支付贷记卡费率
     * 031 翼支付借记卡费率
     * 032 翼支付借记卡封顶手续费
     * 06 银联单笔小于1000贷记卡费率
     * 061 银联单笔小于1000借记卡费率
     * 07 银联单笔大于1000贷记卡费率
     * 071 银联单笔大于1000借记卡费率
     * 072 银联单笔大于1000借记卡封顶手续费
     */
    private List<RateInfo> qrcodeList;

    /**
     * 返回费率信息
     *
     * @return
     */
    public List<RateInfo> collQrCodeList() {
        Map<String, RateInfo> result = new HashMap();
        paywayFeeList.forEach(item -> {
            // 线上费率
            if (CS.PAY_WAY_CODE.SCAN.equals(item.getWayCode())) {
                RateInfo rateInfo = new RateInfo();
                rateInfo.setRateType(RateInfo.WX_CREDIT_RATE);
                rateInfo.setRate(convertRate(item.getFeeRate()));
                result.put(RateInfo.WX_CREDIT_RATE, rateInfo);

                rateInfo = new RateInfo();
                rateInfo.setRateType(RateInfo.ALI_CREDIT_RATE);
                rateInfo.setRate(convertRate(item.getFeeRate()));
                result.put(RateInfo.ALI_CREDIT_RATE, rateInfo);

                rateInfo = new RateInfo();
                rateInfo.setRateType(RateInfo.YSF_DEBIT_RATE_LT_1000);
                rateInfo.setRate(convertRate(item.getFeeRate()));
                result.put(RateInfo.YSF_DEBIT_RATE_LT_1000, rateInfo);

                // 费率
                rateInfo = new RateInfo();
                rateInfo.setRateType(RateInfo.YSF_DEBIT_RATE_GT_1000);
                rateInfo.setRate(convertRate(item.getFeeRate()));
                result.put(RateInfo.YSF_DEBIT_RATE_GT_1000, rateInfo);

                // 封顶
                rateInfo = new RateInfo();
                rateInfo.setRateType(RateInfo.YSF_DEBIT_RATE_GT_1000_TOP);
                rateInfo.setRate("20");
                result.put(RateInfo.YSF_DEBIT_RATE_GT_1000_TOP, rateInfo);

                rateInfo = new RateInfo();
                rateInfo.setRateType(RateInfo.YSF_CREDIT_RATE_LT_1000);
                rateInfo.setRate(convertRate(item.getFeeRate()));
                result.put(RateInfo.YSF_CREDIT_RATE_LT_1000, rateInfo);

                rateInfo = new RateInfo();
                rateInfo.setRateType(RateInfo.YSF_CREDIT_RATE_GT_1000);
                rateInfo.setRate(convertRate(item.getFeeRate()));
                result.put(RateInfo.YSF_CREDIT_RATE_GT_1000, rateInfo);

                return;
            }

            // 微信费率
            if (item.getWayCode().startsWith("WX_")) {
                RateInfo rateInfo = new RateInfo();
                rateInfo.setRateType(RateInfo.WX_CREDIT_RATE);
                rateInfo.setRate(convertRate(item.getFeeRate()));
                result.put(RateInfo.WX_CREDIT_RATE, rateInfo);
            }
            // 支付宝费率
            if (item.getWayCode().startsWith("ALI_")) {
                RateInfo rateInfo = new RateInfo();
                rateInfo.setRateType(RateInfo.ALI_CREDIT_RATE);
                rateInfo.setRate(convertRate(item.getFeeRate()));
                result.put(RateInfo.ALI_CREDIT_RATE, rateInfo);
            }

            // 云闪付费率
            if (item.getWayCode().startsWith("YSF_")) {
                List<PaywayFee> levelList = item.getLevelList();
                // 借记卡费率
                levelList.forEach(ysfItem -> {
                    if (ysfItem.getMaxFee() == 100000L) {
                        RateInfo rateInfo = new RateInfo();
                        rateInfo.setRateType(RateInfo.YSF_DEBIT_RATE_LT_1000);
                        rateInfo.setRate(convertRate(ysfItem.getFeeRate()));
                        result.put(RateInfo.YSF_DEBIT_RATE_LT_1000, rateInfo);
                    } else {
                        // 费率
                        RateInfo rateInfo = new RateInfo();
                        rateInfo.setRateType(RateInfo.YSF_DEBIT_RATE_GT_1000);
                        rateInfo.setRate(convertRate(ysfItem.getFeeRate()));
                        result.put(RateInfo.YSF_DEBIT_RATE_GT_1000, rateInfo);

                        // 封顶
                        rateInfo = new RateInfo();
                        rateInfo.setRateType(RateInfo.YSF_DEBIT_RATE_GT_1000_TOP);
                        rateInfo.setRate("20");
                        result.put(RateInfo.YSF_DEBIT_RATE_GT_1000_TOP, rateInfo);
                    }
                });

                // 贷记卡费率
                List<PaywayFee> creditLevelList = item.getCreditCardPaywayFee().getLevelList();
                creditLevelList.forEach(creditYsfItem -> {
                    if (creditYsfItem.getMaxFee() == 100000L) {
                        RateInfo rateInfo = new RateInfo();
                        rateInfo.setRateType(RateInfo.YSF_CREDIT_RATE_LT_1000);
                        rateInfo.setRate(convertRate(creditYsfItem.getFeeRate()));
                        result.put(RateInfo.YSF_CREDIT_RATE_LT_1000, rateInfo);
                    } else {
                        // 费率
                        RateInfo rateInfo = new RateInfo();
                        rateInfo.setRateType(RateInfo.YSF_CREDIT_RATE_GT_1000);
                        rateInfo.setRate(convertRate(creditYsfItem.getFeeRate()));
                        result.put(RateInfo.YSF_CREDIT_RATE_GT_1000, rateInfo);
                    }
                });
            }
        });

        return new ArrayList<>(result.values());
    }

    private String convertRate(BigDecimal rate) {
        return rate.multiply(BigDecimal.valueOf(100)).stripTrailingZeros().toPlainString();
    }

    /**
     * 刷卡费率（费率单位为%，封顶值单位为元）
     * <p>
     * json格式传入：
     * 21 贷记卡费率，不传默认0.60
     * 22 借记卡费率，不传默认0.55
     * 23 借记卡手续费封顶值，不传默认25
     * 24 云闪付贷记卡费率，不传默认银联二维码1000以上贷记卡费率
     * 25 云闪付的借记卡费率，不传默认银联二维码1000以上贷记卡费率
     * <p>
     * 若传入则对应（21，22，23）三个类型必须同时传入
     * 若传入24，则25必须同时传入
     */
    private List<RateInfo> bankCardRates;

    /**
     * 行业规则ID，枚举值：
     * 00 标准类
     * 01 服饰鞋包、美妆日化、健身运动服务类
     * <p>
     * 仅资质类型为企业/个体户且MCC为《涉及MCC》内的MCC支持传入，不传系统默认 00 标准类
     */
    private String businessRule;

    /**
     * 结算类型，枚举值
     * 取值范围：
     * 03 T1结算
     * 04 D1结算
     * 不传值时，系统会根据合作机构签约时的默认结算产品执行。
     */
    @JSONField(serialize = false)
    public String getSettleType() {
        if (CS.SETTLEMENT_TYPE.D1.equals(settlementType)) {
            return "04";
        }

        if (CS.SETTLEMENT_TYPE.T1.equals(settlementType)) {
            return "03";
        }

        throw new BizException("未知的结算方式");
    }

    /**
     * 银行卡预授权开关，枚举值
     * 取值范围：
     * 01 关闭
     * 02 开通
     */
    private String bankCardPreAuthorization;

    /**
     * 二维码预授权开关，枚举值
     * 取值范围：
     * 01 关闭
     * 02 开通
     */
    private String qrCodePreAuthorization;

    /**
     * 指定微信渠道号
     * 多渠道号情况下使用，进件到指定微信渠道号下
     */
    private String specifyWechatChannel;

    /**
     * 指定支付宝PID
     */
    private String specifyALiPayChannel;

    /**
     * 回调地址
     * 说明：天阙平台支持推送商户入驻审核的终态结果给该地址，推送格式参见接口【入驻审核结果通知】
     * 如果不传，则依赖入驻结果查询接口获取审核最终状态
     */
    private String callbackUrl;

    /**
     * 复核回调地址
     * 说明：传入则在商户入网状态为【入驻通过】时，返回复核标识及补充资料内容推送至该地址，推送格式参照接口【复核结果通知】
     */
    private String checkCallbackUrl;

    /**
     * 使用mchFullName
     * 营业执照注册名称
     * 需确保和营业执照照片一致，如果个体户营业执照中没有注册名称或注册名称是*，此处需要按照"个体户+法人姓名"的格式传入。
     * 资质类型为个体户、企业、政府机关、事业单位、其他组织(haveLicenseNo==02/03/04/05/06)时，本字段必填
     */
    @JSONField(serialize = false)
    public String getCprRegNmCn() {
        return mchFullName;
    }

    /**
     * 营业执照注册号
     * 营业执照号/统一信用编码。
     * 资质类型为个体户、企业、政府机关、事业单位、其他组织(haveLicenseNo==02/03/04/05/06)时，本字段必填
     */
    @JSONField(serialize = false)
    public String getRegistCode() {
        return licenseNo;
    }

    /**
     * 是否三证合一，枚举值
     * 取值范围：
     * 00 是
     * 01 否
     * 资质类型为企业、政府机关、事业单位、其他组织(haveLicenseNo==03/04/05/06)时，本字段必填
     */
    @JSONField(serialize = false)
    public String getLicenseMatch() {
        return "00";
    }

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

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

    /**
     * 使用licenseEffectBegin
     * <p>
     * 营业执照起始日
     * 格式为：YYYYMMDD
     * 营业执照起始日、营业执照到期日需同时上传
     */
    @JSONField(serialize = false)
    public String getBusinessLicStt() {
        Assert.notNull(licenseEffectBegin, "营业执照起始日不能为空");

        return licenseEffectBegin.replace("-", "");
    }

    /**
     * 营业执照到期日
     * 格式为：YYYYMMDD
     * 营业执照起始日、营业执照到期日需同时上传
     * 长期有效请传29991231
     */
    @JSONField(serialize = false)
    public String getBusinessLicEnt() {
        Assert.notNull(licenseEffectEnd, "营业执照截止日期不能为空");

        if ("长期".equals(licenseEffectEnd)) {
            return "29991231";
        }

        return licenseEffectEnd.replace("-", "");
    }

    /**
     * 法人/商户负责人姓名
     */
    @JSONField(serialize = false)
    public String getIdentityName() {
        return idcardName;
    }

    /**
     * 法人/商户负责人证件类型，枚举值
     * 取值范围：
     * 00 身份证
     * 05 港澳居民往来内地通行证
     * 06 台湾居民来往大陆通行证
     * 07 护照
     * 99 其他
     */
    private String identityTyp;

    /**
     * 法人/商户负责人证件号
     */
    @JSONField(serialize = false)
    public String getIdentityNo() {
        return idcardNo;
    }

    /**
     * 法人身份证有效期开始时间
     */
    @JSONField(serialize = false)
    public String getLegalPersonLicStt() {
        Assert.notNull(idcardEffectBegin, "法人/商户负责人证件起始日不能为空");

        return idcardEffectBegin.replace("-", "");
    }

    /**
     * 法人/商户负责人证件到期日
     * 格式为：YYYYMMDD
     * 长期有效请传29991231
     *
     * @return
     */
    @JSONField(serialize = false)
    public String getLegalPersonLicEnt() {
        Assert.notNull(idcardEffectBegin, "法人/商户负责人证件到期日不能为空");

        if (idcardEffectEnd.equals("长期")) {
            return "29991231";
        }

        return idcardEffectEnd.replace("-", "");
    }

    /**
     * 结算账户名
     * 说明：自然人商户、线上类商户不允许授权结算。对公结算账户名与注册名没有包含关系时，需上传授权函。
     *
     * @return
     */
    @JSONField(serialize = false)
    public String getActNm() {
        return settAccountName;
    }

    /**
     * 使用 settAccountType
     * 结算账户类型，枚举值
     * 取值范围：
     * 00 对公
     * 01 对私
     * 说明：自然人商户只允许对私结算；线上商户只允许对公结算
     */
    @JSONField(serialize = false)
    public String getActTyp() {
        if ("B".equals(settAccountType)) {
            return "00";
        }

        if ("C".equals(settAccountType)) {
            return "01";
        }

        throw new BizException("未知的结算账户类型");
    }

    /**
     * 结算人证件类型，枚举值
     * 取值范围：
     * 00 身份证
     * 05 港澳居民往来内地通行证
     * 06 台湾居民来往大陆通行证
     * 07 护照
     * 99 其他
     */
    private String actNoType;

    @JSONField(serialize = false)
    public String getActNo() {
        return settAccountNo;
    }

    /**
     * 使用 settAccountIdcardNo
     * 结算人证件号
     * 对私结算必传
     */
    @JSONField(serialize = false)
    public String getStmManIdNo() {
        if ("Y".equals(authSettle)) {
            return settAccountIdcardNo;
        } else {
            return idcardNo;
        }
    }

    @JSONField(serialize = false)
    public String getAccountLicStt() {
        if (Objects.equals(authSettle, "Y")) {
            return settAccountIdcardEffectBegin.replace("-", "");
        } else {
            return idcardEffectBegin.replace("-", "");
        }
    }

    /**
     * 结算人证件号到期日
     * 格式为：YYYYMMDD
     * 长期有效请传29991231
     */
    @JSONField(serialize = false)
    public String getAccountLicEnt() {
        if (!Objects.equals(authSettle, "Y")) {
            return getLegalPersonLicEnt();
        } else {
            Assert.notNull(settAccountIdcardEffectEnd, "结算人证件号到期日不能为空");
            if (settAccountIdcardEffectEnd.equals("长期")) {
                return "29991231";
            }
            return settAccountIdcardEffectEnd.replace("-", "");
        }
    }

    /**
     * 使用 settAccountBankName
     * 开户银行
     * 如联行行号不传，【开户银行、开户省份、开户城市】即为必传
     */
    @JSONField(serialize = false)
    public String getDepoBank() {
        return settAccountBankName;
    }

    @JSONField(serialize = false)
    public String getDepoProvCd() {
        if (settAccountBankBranchAreaCode == null || settAccountBankBranchAreaCode.isEmpty()) {
            throw new BizException("开户行省市区不能为空");
        }
        return settAccountBankBranchAreaCode.getString(0);
    }

    @JSONField(serialize = false)
    public String getDepoCityCd() {
        if (settAccountBankBranchAreaCode == null || settAccountBankBranchAreaCode.size() < 2) {
            throw new BizException("开户行市区不能为空");
        }
        return settAccountBankBranchAreaCode.getString(1);
    }


//    private String lbnkNo;

    /**
     * 使用 settAccountBankBranchCode
     * 开户支行联行行号
     * 对公必传，对私非18大行必传；发卡行是村镇银行、城市商业银行、农村商业银行、其他银行则必传
     */
    @JSONField(serialize = false)
    public String getLbnkNo() {
        return settAccountBankBranchCode;
    }

    /**
     * 开户支行名称
     */
    @JSONField(serialize = false)
    public String getLbnkNm() {
        return settAccountBankName;
    }

    /**
     * 营业执照照片地址, 上传返回的图片短链接
     * 个体、企业、政府机关、事业单位、其他组织必传
     */
    @JSONField(serialize = false)
    public String getLicensePic() {
        return licenseImg;
    }

    /**
     * 税务登记证照片地址, 上传返回的图片短链接
     * 企业、政府机关、事业单位、其他组织非三证合一必传
     */
    private String taxRegistLicensePic;

    /**
     * 组织机构代码证照片地址
     * 企业、政府机关、事业单位、其他组织非三证合一必传
     */
    private String orgCodePic;

    /**
     * 法人/商户负责人身份证正面(人像面)照片地址
     */
    @JSONField(serialize = false)
    public String getLegalPersonidPositivePic() {
        return idcard1Img;
    }

    /**
     * 法人/商户负责人身份证反面(国徽面)照片地址
     */
    @JSONField(serialize = false)
    public String getLegalPersonidOppositePic() {
        return idcard2Img;
    }

    /**
     * 开户许可证照片地址
     * 对公结算必传
     */
    @JSONField(serialize = false)
    public String getOpeningAccountLicensePic() {
        return companyAccountLicenseImg;
    }

    /**
     * 银行卡正面照片地址
     * 对私结算必传
     */
    @JSONField(serialize = false)
    public String getBankCardPositivePic() {
        return settAccountLicenseImg;
    }

    /**
     * 银行卡反面照片地址
     */
    private String bankCardOppositePic;

    /**
     * 结算人身份证正面(人像面)照片地址
     * 对私授权结算必传
     */
    @JSONField(serialize = false)
    public String getSettlePersonIdcardPositive() {
        if (Objects.equals("Y", authSettle)) {
            return settAccountIdcard1Img;
        } else {
            return idcard1Img;
        }
    }

    @JSONField(serialize = false)
    public String getSettlePersonIdcardOpposite() {
        if (Objects.equals("Y", authSettle)) {
            return settAccountIdcard2Img;
        } else {
            return idcard2Img;
        }
    }

    /**
     * 商户协议照片地址
     */
    private String merchantAgreementPic;

    /**
     * 门头照片地址
     */
    @JSONField(serialize = false)
    public String getStorePic() {
        return storeOuterImg;
    }

    /**
     * 真实商户内景照片地址
     */
    @JSONField(serialize = false)
    public String getInsideScenePic() {
        return storeInnerImg;
    }

    /**
     * 经营场所(含收银台)照片地址
     */
    @JSONField(serialize = false)
    public String getBusinessPlacePic() {
        return storeCashierImg;
    }

    /**
     * ICP许可证或公众号主体信息截图照片地址
     * 线上网站类、公众号类商户必传
     * 经营类型为线上(operationalType=='02')时，本字段必填
     */
    private String icpLicence;

    /**
     * 手持身份证(人像面)照片地址
     */
    private String handIdcardPic;

    /**
     * 租赁协议一(封面)照片地址
     */
    private String leaseAgreementOnePic;

    /**
     * 租赁协议二(面积、有效期页)照片地址
     */
    private String leaseAgreementTwoPic;

    /**
     * 租赁协议三(签章页)照片地址
     */
    private String leaseAgreementThreePic;

    /**
     * 其他资料照片1地址
     * 机构跟银行的合作协议关键页或机构银行合作授权函 （支付宝非盈利时需要上传）
     */
    private String otherMaterialPictureOne;

    /**
     * 其他资料照片2地址
     * 内景照片（支付宝非盈利时需要上传）
     */
    private String otherMaterialPictureTwo;

    /**
     * 其他资料照片3地址
     * 财务室照片（支付宝非盈利时需要上传）
     */
    private String otherMaterialPictureThree;

    /**
     * 其他资料照片4地址
     */
    private String otherMaterialPictureFour;

    /**
     * 其他资料照片5地址
     */
    private String otherMaterialPictureFive;

    /**
     * 代理人签名照片地址
     */
    private String agentPersonSignature;

    /**
     * 确认人签名照片地址
     */
    private String confirmPersonSignature;

    /**
     * 授权函照片地址
     * 非法人对私结算，即结算账户类型为对私结算，且结算人身份证号与法人身份证号不一致时该字段必传非法人结算授权函；
     * 结算账户类型为对公结算，结算账户名与营业执照注册名称不一致时该字段必传对公结算说明函
     */
    private String letterOfAuthPic;

    /**
     * 统一结算无营业执照说明照片地址
     * 个人资质的连锁分店，如果统一结算，需上传总店对该店情况说明、证明连锁关系
     */
    private String unionSettleWithoutLicense;

    /**
     * 民办非企业单位登记证书
     * 部分MCC必传，参照 https://paas.tianquetech.com/docs/#/api/shrz
     */
    private String privateNonEnterprisePic;

    /**
     * 收费样本文件
     * 部分MCC必传，参照 https://paas.tianquetech.com/docs/#/api/shrz
     */
    private String feeSimplesPic;

    /**
     * 卫生局批文
     * 部分MCC必传，参照 https://paas.tianquetech.com/docs/#/api/shrz
     */
    private String healthBureauApprovalPic;

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

    @Override
    public String bankAccountName() {
        return settAccountName;
    }

    @Override
    public void saveCheck() {
        super.saveCheck();
        Assert.notNull(settAccountBankBranchCode, "开户支行联行号不能为空");
    }

    @Data
    public static class RateInfo {

        /**
         * 01 微信贷记卡费率
         * 011微信借记卡费率
         * 012微信借记卡封顶手续费
         * 02 支付宝贷记卡费率
         * 021 支付宝借记卡费率
         * 022 支付宝借记卡封顶手续费
         * 03 翼支付贷记卡费率
         * 031 翼支付借记卡费率
         * 032 翼支付借记卡封顶手续费
         * 06 银联单笔小于1000贷记卡费率
         * 061 银联单笔小于1000借记卡费率
         * 07 银联单笔大于1000贷记卡费率
         * 071 银联单笔大于1000借记卡费率
         * 072 银联单笔大于1000借记卡封顶手续费
         */
        @JSONField(ordinal = 1)
        private String rateType;

        @JSONField(ordinal = 2)
        private String rate;

        public static final String WX_CREDIT_RATE = "01";
        public static final String WX_DEBIT_RATE = "011";
        public static final String WX_DEBIT_RATE_TOP = "012";

        public static final String ALI_CREDIT_RATE = "02";
        public static final String ALI_DEBIT_RATE = "021";
        public static final String ALI_DEBIT_RATE_TOP = "022";

        public static final String YZF_CREDIT_RATE = "03";
        public static final String YZF_DEBIT_RATE = "031";
        public static final String YZF_DEBIT_RATE_TOP = "032";

        public static final String YSF_CREDIT_RATE_LT_1000 = "06";
        public static final String YSF_DEBIT_RATE_LT_1000 = "061";

        public static final String YSF_CREDIT_RATE_GT_1000 = "07";
        public static final String YSF_DEBIT_RATE_GT_1000 = "071";
        public static final String YSF_DEBIT_RATE_GT_1000_TOP = "072";
    }
}
