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

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.jeequan.jeepay.core.annotate.Desensitized;
import com.jeequan.jeepay.core.constants.DesensitizedTypeEnum;
import com.jeequan.jeepay.core.exception.BizException;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

/***
 * 进件资料的基本信息
 *
 * @author terrfly
 * @date 2021/12/30 9:01
 */
@Data
public class ApplymentBasicInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 标识时间长期有效的值
     **/
    public static final String DATE_FOREVER_VAL = "长期";

    /**  ↓↓↓-- 所属行业和基础信息 --↓↓↓  **/

    /**
     * 行业 mcc 码
     **/
    protected String mccCode;

    protected String mccName;

    /**
     * 商户类型：参考 t_mch_applyment
     **/
    protected Byte merchantType;

    /**
     * 登录账号
     **/
    protected String loginAccount;

    /**
     * 联系人姓名
     **/
    @Desensitized(type = DesensitizedTypeEnum.CHINESE_NAME)
    protected String contactName;

    /**
     * 联系人电话
     **/
    @Desensitized(type = DesensitizedTypeEnum.MOBILE_PHONE)
    protected String contactPhone;

    /**
     * 法人手机号
     */
    protected String legalPersonPhone;

    /**
     * 联系人邮箱
     **/
    @Desensitized(type = DesensitizedTypeEnum.EMAIL)
    protected String contactEmail;

    /**
     * 联系人身份证号码
     **/
    @Desensitized(type = DesensitizedTypeEnum.ID_CARD)
    protected String contactIdcardNo;

    /**
     * 联系人身份证地址
     **/
    @Desensitized(type = DesensitizedTypeEnum.ADDRESS)
    protected String contactIdcardAddress;

    /**
     * 非法人结算授权函
     */
    protected String letterOfAuthPic;

    /**
     * 联系人身份证有效期起始日期
     **/
    protected String contactIdcardEffectBegin;

    /**
     * 联系人身份证有效期结束日期
     **/
    protected String contactIdcardEffectEnd;

    /**
     * 联系人身份证正面照
     **/
    protected String contactIdcard1Img;

    /**
     * 联系人身份证反面照
     **/
    protected String contactIdcard2Img;

    /**
     * 非法人作为联系人时 微信业务办理授权函
     **/
    protected String contactWxAuthImg;

    /**  ↑↑↑-- 选择所属行业和基础信息 --↑↑↑  **/

    /**  ↓↓↓-- 经营信息 --↓↓↓  **/

    /**
     * 商户简称
     */
    protected String mchShortName;

    /**
     * 商户全称
     **/
    protected String mchFullName;

    /**
     * 门头照
     **/
    protected String storeOuterImg;

    /**
     * 收银台照片
     **/
    protected String storeCashierImg;

    /**
     * 店内环境照片
     **/
    protected String storeInnerImg;

    /**
     * 结算
     */
    protected String cashierWithSettlerImg;

    /**
     * 省市县编码 (包含省市县三级编码)
     **/
    protected JSONArray areaCode;

    /**
     * 省市区名称 (包含省市县三级编码)
     */
    protected JSONArray areaName;

    /**
     * 详细地址
     **/
    protected String address;

    /**
     * 不带拼接的字段
     */
    protected String mchAddress;

    /**  ↑↑↑-- 经营信息 --↑↑↑  **/

    /**  ↓↓↓-- 经营证件 --↓↓↓  **/

    /**
     * 身份证姓名
     */
    @Desensitized(type = DesensitizedTypeEnum.CHINESE_NAME)
    protected String idcardName;

    /**
     * 身份证号
     **/
    @Desensitized(type = DesensitizedTypeEnum.ID_CARD)
    protected String idcardNo;

    /**
     * 身份证正面人像面 照片
     **/
    protected String idcard1Img;

    /**
     * 身份证国徽面 照片
     **/
    protected String idcard2Img;

    /**
     * 身份证地址
     **/
    @Desensitized(type = DesensitizedTypeEnum.ADDRESS)
    protected String idcardAddress;

    /**
     * 身份证有效期开始时间
     **/
    protected String idcardEffectBegin;

    /**
     * 身份证有效期截止时间
     **/
    protected String idcardEffectEnd;

    /**
     * 法人手持身份证照片
     **/
    protected String idcardInHandImg;

    /**
     * 营业执照编号
     **/
    @Desensitized(type = DesensitizedTypeEnum.ID_CARD)
    protected String licenseNo;


    protected String licenseName;

    /**
     * 营业执照照片
     **/
    protected String licenseImg;

    /**
     * 营业执照注册地址
     **/
    protected String licenseAddress;

    /**
     * 营业执照有效期开始时间
     **/
    protected String licenseEffectBegin;

    /**
     * 营业执照有效期截止时间
     **/
    protected String licenseEffectEnd;

    /**
     * 经营范围，部分通道需要
     */
    protected String licenseScope;

    /**  ↑↑↑-- 经营证件 --↑↑↑  **/

    /**  ↓↓↓-- 结算账号 --↓↓↓  **/

    /**
     * 结算账号类型 B:对公,C:对私
     */
    protected String settAccountType;

    /**
     * 结算账号名称
     **/
    @Desensitized(type = DesensitizedTypeEnum.CHINESE_NAME)
    protected String settAccountName;

    /**
     * 结算银行卡账号
     **/
    @Desensitized(type = DesensitizedTypeEnum.BANK_CARD)
    protected String settAccountNo;

    /**
     * 结算银行名称
     **/
    protected String settAccountBankName;

    /**
     * 结算银行编码
     */
    protected String settAccountBankCode;

    /**
     * 结算银行开户支行区域编码
     **/
    protected JSONArray settAccountBankBranchAreaCode;

    /**
     * 结算银行开户支行区域名称
     **/
    protected JSONArray settAccountBankBranchAreaName;

    /**
     * 结算银行开户银行支行名称
     **/
    protected String settAccountBankBranchName;

    /**
     * 结算银行开户银行支行联行号
     */
    protected String settAccountBankBranchCode;

    /**
     * 银行卡照片
     */
    protected String settAccountLicenseImg;

    /**
     * （结算到非法人时必填） 结算卡持卡人 身份证号
     **/
    @Desensitized(type = DesensitizedTypeEnum.ID_CARD)
    protected String settAccountIdcardNo;

    /**
     * （结算到非法人时必填） 结算卡持卡人 身份证正面人像面 照片
     **/
    protected String settAccountIdcard1Img;

    /**
     * （结算到非法人时必填） 结算卡持卡人 身份证国徽面 照片
     **/
    protected String settAccountIdcard2Img;

    /**
     * （结算到非法人时必填） 结算卡持卡人 身份证有效期开始时间
     **/
    protected String settAccountIdcardEffectBegin;

    /**
     * （结算到非法人时必填） 结算卡持卡人 身份证有效期截止时间
     **/
    protected String settAccountIdcardEffectEnd;

    /**
     * 认证账户类型（部分接口需要验证使用）： B-对公， C-对私
     **/
//    protected String companyAccountType;

    /**
     * 对公（部分接口需要验证使用）： 营业执照相同的对公账户名称
     **/
//    protected String companyAccountName;

    /**
     * 对公（部分接口需要验证使用）：结算银行卡账号
     **/
//    @Desensitized(type = DesensitizedTypeEnum.BANK_CARD)
//    protected String companyAccountNo;

    /**
     * 对公（部分接口需要验证使用）：银行卡名称
     **/
//    protected String companyAccountBankName;

    /**
     * 对公（部分接口需要验证使用）：银行开户支行区域编码
     **/
//    protected JSONArray companyAccountBankBranchAreaCode;

    /**
     * 对公（部分接口需要验证使用）：银行开户银行支行名称
     **/
//    protected String companyAccountBankBranchName;

    /**
     * 对公（部分接口需要验证使用）：开户许可证照片
     */
    protected String companyAccountLicenseImg;

    /**
     * @since 2024.02.29
     * 是否为授权结算, 后期接入的通道使用该字段为授权结算的标记
     * Y - 是, N - 否
     */
    protected String authSettle;

    /**  ↑↑↑-- 结算账号 --↑↑↑  **/

    /**
     * 是否开通分账 0-否 1-是
     */
    private Byte isDivision;

    /**
     * 签约产品费率列表
     **/
    protected List<PaywayFee> paywayFeeList;

    /**
     * 企业受益人信息列表（企业时必传）
     **/
    protected List<IdcardInfo> companyBeneficiaryList;

    /**
     * 上传图片的缓存map (用作： 修改时， 如果已经上传了该图片则不再重新上传，直接使用缓存中的 mediaId / imgId / photoId)
     **/
    protected Map<String, String> uploadImgCache;

    /**
     * 结算方式，D0，D1，T1
     */
    protected String settlementType;


    public static Class<ApplymentBasicInfo> getImplInfoClass(String ifCode) {

        try {

            return (Class<ApplymentBasicInfo>) Class.forName("com.jeequan.jeepay.core.model.applyment." + StrUtil.upperFirst(ifCode) + "ApplymentInfo");

        } catch (Exception e) {

            return null;

        }
    }

    /**
     * 获取支行联行号，每个渠道目前使用的字段不一致，这里使用统一返回方法
     * @return
     */
    public String bankBranchNo() {
        return settAccountBankBranchCode;
    }

    public String bankAccountName() {
        return settAccountName;
    }

    /**
     * 保存时的数据校验
     */
    public void saveCheck() {
        // 添加默认的校验
        Date now = new Date();
        // 30天后
        DateTime nowAfter30 = DateUtil.offsetDay(now, 30);
        // yyyyMMdd
        String nowAfter30Str = DateUtil.format(nowAfter30, DatePattern.PURE_DATE_FORMAT);

        if (contactIdcardEffectEnd != null && !contactIdcardEffectEnd.equals("长期")) {
            if (contactIdcardEffectEnd.replace("-", "").compareTo(nowAfter30Str) < 0) {
                throw new BizException("联系人身份证有效期不足30天");
            }
        }

        if (idcardEffectEnd != null && !idcardEffectEnd.equals("长期")) {
            if (idcardEffectEnd.replace("-", "").compareTo(nowAfter30Str) < 0) {
                throw new BizException("法人/经营者身份证有效期不足30天");
            }
        }

        if (licenseEffectEnd != null && !licenseEffectEnd.equals("长期")) {
            if (licenseEffectEnd.replace("-", "").compareTo(nowAfter30Str) < 0) {
                throw new BizException("营业执照有效期不足30天");
            }
        }

        if (settAccountIdcardEffectEnd != null && !settAccountIdcardEffectEnd.equals("长期")) {
            if (settAccountIdcardEffectEnd.replace("-", "").compareTo(nowAfter30Str) < 0) {
                throw new BizException("结算人身份证有效期不足30天");
            }
        }
    }
}
