package com.jeequan.jeepay.core.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.jeequan.jeepay.core.constants.CS;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.util.Date;
import java.util.function.Function;

/**
 * <p>
 * 特约商户进件信息表
 * </p>
 *
 * @author [mybatis plus generator]
 * @since 2021-12-28
 */
@EqualsAndHashCode(callSuper = false)
@Data
@Accessors(chain = true)
public class MchApplyment extends BaseModel {

    /**
     * 状态:
     * 0-未发起（草稿）、
     * 1-审核中、
     * 2-进件成功、
     * 3-驳回待修改、
     * 4-待验证、 5-待签约、6-签约完成/审核成功，等待其他操作、 7-等待系统预审核、 8-预审核拒绝 ,
     * 11-图片待提交
     */
    /** 未发起（草稿）*/
    public static final byte STATE_SAVE = 0;
    /** 审核中 */
    public static final byte STATE_AUDITING = 1;
    /** 进件成功 */
    public static final byte STATE_SUCCESS = 2;
    /** 驳回待修改，该状态下，提交审核不需要运营后台审核 */
    public static final byte STATE_REJECT_WAIT_MODIFY = 3;
    /** 待验证, 待补充资料等 */
    public static final byte STATE_WAIT_VERIFY = 4;
    /** 待签约 */
    public static final byte STATE_WAIT_SIGN = 5;
    /** 签约完成  */
    public static final byte STATE_FINISH_SIGN = 6;
    /** 预审，需要运营后台审核 */
    public static final byte STATE_WAIT_PRE_AUDITING = 7;
    /** 预审审核驳回，改状态下，再次发起审核时，需要运营后台审核 */
    public static final byte STATE_WAIT_PRE_AUDIT_REJECT = 8;
    /** 通过未生效，主要用于部分通道商户信息变更次日生效的情况 */
    public static final byte STATE_SUCCESS_INEFFECTIVE = 9;
    /** 待复审 */
    public static final byte STATE_SUCCESS_NEED_SECOND_VERIFY = 12;
    /** 任务等待中, 后根据提交的剩余步骤去执行相关的商户操作 */
    public static final byte STATE_AUDITING_WAIT = 100;
    /** 待商户确认 */
    public static final byte STATE_AFFIRM = 30;

    /** 通道人工审核 */
    public static final byte STATE_UPSTREAM_MANUAL_REVIEW = 11;
    /** 风控 */
    public static final byte STATE_WAIT_RISK = 20;
    /** 冻结 */
    public static final byte STATE_WAIT_FREEZE = 21;
    /** 注销 */
    public static final byte STATE_WAIT_LOGOUT = 22;

    /** 1-个人, 2-个体工商户, 3-企业, 4-党政、机关及事业单位, 5-其他组织, 6-个人卖家 **/
    public static final byte MERCHANT_TYPE_PERSONAL = 1;
    public static final byte MERCHANT_TYPE_INDIVIDUAL = 2;
    public static final byte MERCHANT_TYPE_ENTERPRISE = 3;
    public static final byte MERCHANT_TYPE_GOV = 4;
    public static final byte MERCHANT_TYPE_OTHER = 5;
    public static final byte MERCHANT_TYPE_PERSONAL_SELLER= 6; // 收付通新增，个人卖家，指无营业执照，已持续从事电子商务经营活动满6个月，且期间经营收入累计超过20万元的个人商家。

    /** B-对公, C-对私 **/
    public static final String SETT_ACCOUNT_TYPE_CORPORATE = "B";
    public static final String SETT_ACCOUNT_TYPE_PERSONAL = "C";

    /**
     * 默认 收款商户
     */
    public static final String REFUND_WAY_PAYMENT = "payment";

    /**
     * 平台户
     */
    public static final String REFUND_WAY_PLATFORM = "platform";


    private static final long serialVersionUID = 1L;

    /**
     * 回调链接
     */
    private String notifyUrl;

    /**
     * 系统申请单号
     */
    private String applyId;


    private String subApplyId;

    /**
     * 渠道申请单号
     */
    private String channelApplyNo;

    /**
     * 渠道要求的自定义商户号（建议采用mchNo_时间戳（10位）的形式）
     */
    private String channelDiyMchNo;

    /**
     * 收单机构编号
     */
    private String channelMchNo;

    /**
     * 商户号
     */
    private String mchNo;

    /**
     * 渠道商号
     */
    private String isvNo;

    /**
     * 服务商号
     */
    private String agentNo;

    /**
     * 顶级服务商号
     */
    private String topAgentNo;

    /**
     * 支付接口代码
     */
    private String ifCode;

    /**
     * 接口名称
     */
    private String ifName;

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

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

    /**
     * 商户类型： 1-个人, 2-个体工商户, 3-企业, 4-党政、机关及事业单位, 5-其他组织
     */
    private Byte merchantType;

    /**
     * 联系人（不一定的法人）姓名
     */
    private String contactName;

    /**
     * 联系人电话
     */
    private String contactPhone;

    /**
     * 省市县编码 (非必填， 放在外层用作搜索方便)
     */
    private String areaCode;

    /**
     * 省市县名称描述
     */
    private String areaInfo;

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

    /**
     * 商户进件详细消息（JSON类型）
     */
    private String applyDetailInfo;


    /**
     * 状态: 0-未发起（草稿）、 1-审核中、 2-进件成功、 3-驳回待修改、 4-待验证、 5-待签约、6-签约完成/审核成功，等待其他操作、 7-等待系统预审核、 8-预审核拒绝
     */
    private Byte state;

    /**
     * 备注信息
     */
    private String remark;

    /**
     * 运营端的备注信息
     */
    private String mgrRemark;

    /**
     * 服务商端备注
     */
    private String agtRemark;

    /**
     * 商户端备注
     */
    private String mchRemark;

    /**
     * 入网操作剩余步骤，总共有几步主要看通道
     */
    private Byte remainStep;

    /**
     * 进件成功接口返回参数, 用于配置到商户侧的参数信息
     */
    private String succResParameter;

    /**
     * 渠道拓展参数1
     */
    private String channelVar1;

    /**
     * 渠道拓展参数2
     */
    private String channelVar2;

    @TableField(exist = false)
    private String wxCertState;

    @TableField(exist = false)
    private String aliCertState;

    /**
     * 门店入驻成功接口返回参数
     */
    private String storeSuccResParameter;

    /**
     * 响应提示信息（一般进件异常或提示信息）
     */
    private String applyErrorInfo;

    /**
     * 商户所属拓展员ID
     */
    private Long epUserId;

    /**
     * 进件来源
     */
    private String applyPageType;

    /**
     * 默认结算方式
     * 部分通道可以根据传参发起多种结算方式的订单
     */
    private String settlementType;

    /**
     * 自动配置的应用ID，不为空自动进行关联等一系列配置
     */
    private String autoConfigMchAppId;


    /**
     * 自动配置结果信息
     */
    private String autoConfigResultInfo;

    /**
     * 创建者用户ID
     */
    private Long createdUid;

    /**
     * 创建者姓名
     */
    private String createdBy;

    /**
     * 最后一次请求上游时间
     */
    private Date lastApplyAt;

    /**
     * 创建时间
     */
    private Date createdAt;

    /**
     * 更新时间
     */
    private Date updatedAt;

    /**
     * 支付配置参数ID，关联t_mch_pay_interface_config的ID
     */
    private Long payInterfaceId;

    /**
     * 进件时使用的入网配置参数
     */
    private String ifParams;

    /**
     * 退款类型 payment:收款商户 platform 平台账户
     */
    private String refundWay;

    @TableField(exist = false)
    private Integer wxAuthenticationState;

    @TableField(exist = false)
    private Integer zfbAuthenticationState;

    /**
     * 反扫权限开关。1：开；0：关；2：未指定，根据业务判断是否开关
     * 为空同2
     */
    private Integer scanPayPerm;

    public boolean scanPayPermFlag(Function<Void, Boolean> function) {
        if (scanPayPerm == 1) {
            return true;
        }

        if (scanPayPerm == 0) {
            return false;
        }

        if (function != null) {
            return function.apply(null);
        }

        // 默认根据接结算方式判断
        return !CS.SETTLEMENT_TYPE.D0.equals(settlementType);
    }
}
