package com.jeequan.jeepay.db.entity;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;

import java.math.BigDecimal;
import java.util.Date;

/**
 * <p>
 * 费率配置表
 * </p>
 *
 * @author [mybatis plus generator]
 * @since 2022-03-12
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@SuperBuilder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "t_rate_config", autoResultMap = true)
public class RateConfig extends BaseModel {


    public static LambdaQueryWrapper<RateConfig> gw(){
        return new LambdaQueryWrapper<>();
    }

    /** infoId 的后缀  ( 也是 map的分类key ) **/
    public static final String AGENTRATE = "AGENTRATE";
    public static final String MCHRATE = "MCHRATE";
    /**
     * 渠道商底价
     */
    public static final String ISVCOST = "ISVCOST";
    /**
     * 下级服务商默认费率
     */
    public static final String AGENTDEF = "AGENTDEF";
    /**
     * 下级服务商最大费率
     */
    public static final String AGENTMAX = "AGENTMAX";
    /**
     * 下级商户默认费率
     */
    public static final String MCHAPPLYDEF = "MCHAPPLYDEF";
    /**
     * 下级商户最大费率
     */
    public static final String MCHAPPLYMAX = "MCHAPPLYMAX";

    public static String buildInfoId(String infoId, String suffix){
        return infoId + "_" + suffix;
    }

    // 以下两个用于页面显示使用。 （DB不会用到）
    public static final String READONLYISVCOST = "READONLYISVCOST";
    public static final String READONLYPARENTAGENT = "READONLYPARENTAGENT";
    public static final String READONLYPARENTDEFRATE = "READONLYPARENTDEFRATE"; // 读取上级配置的默认费率
//    public static final String READONLYMCHMAX = "READONLYMCHMAX"; // 当前服务商的商户最大费率
    public static final String READONLYPARENTMCHMAX = "READONLYPARENTMCHMAX"; // 读取上级配置的商户最大费率
    public static final String READONLYPARENTSUBAGENTMAX = "READONLYPARENTSUBAGENTMAX"; // 读取上级的可开下级的最大费率


    public static String getRealInfoId(String infoId){
        return infoId.replace( "_" + AGENTRATE, "")
                .replace("_" + MCHRATE, "")
                .replace("_" + ISVCOST, "")
                .replace("_" + AGENTDEF, "")
                .replace("_" + MCHAPPLYDEF, "")
                .replace("_" + MCHAPPLYMAX, "")
                .replace("_" + AGENTMAX, "");
    }

    public static String appendInfoByAgent(String agentNo){
        return agentNo + "_" + AGENTRATE;
    }

    public static String appendInfoByMchApp(String mchAppId){
        return mchAppId + "_" + MCHRATE;
    }

    public static String appendInfoByIsvCost(String isvNo){
        return isvNo + "_" + ISVCOST;
    }

    public static String appendInfoByAgentDef(String infoId){
        return infoId + "_" + AGENTDEF;
    }

    public static String appendInfoByMchDef(String infoId){
        return infoId + "_" + MCHAPPLYDEF;
    }

    public static String appendInfoByMchMax(String infoId){
        return infoId + "_" + MCHAPPLYMAX;
    }



    /**
     *
     * ( mgrIsv ) 运营平台对服务商的配置：  查询【服务商所有支持的支付方式】
     * 支付产品 、 [配置]渠道商底价、  [配置]服务商默认费率、  [配置]商户默认费率。
     *
     * ( mgrAgent ) 运营平台对服务商的费率配置： 查询： 【代理的所属服务商 、 所属上级服务商的所有开通的支付产品】
     * 支付产品、 [显示]渠道商底价， [显示]上级服务商费率、  [配置]服务商的费率、  [配置]下级服务商的默认费率、  [配置]商户默认费率。
     *
     * ( mgrMch ) 运营平台对商户：  查询【商户的所属服务商 、 所属上级服务商的所有开通的支付产品】
     * 支付产品、 [显示]渠道商底价， [显示]上级服务商费率、  [配置]商户的费率。
     *
     * ( agentSelf ) 服务商 对自己：   查询【当前服务商已经开通的产品】
     * 支付产品、 [显示]当前服务商的费率、  [配置]下级服务商的默认费率、  [配置]商户默认费率。
     *
     * ( agentSubagent ) 服务商对下级服务商：  查询【当前服务商已经开通的产品】
     * 支付产品、 [显示]当前服务商的费率、  [配置]下级服务商的费率
     *
     * ( agentMch ) 服务商对商户： 查询【当前服务商已经开通的产品】
     * 支付产品、 [显示]上级服务商费率、  [配置]商户的费率。
     *
     *
     *  * ( mchSelfApp1 ) 商户： 配置自己应用的配置 （普通商户）
     *
     *  * ( mchSelfApp2 ) 商户： 配置自己应用的配置 （特约商户）
     *
     */
    public static final String CONFIG_MODE_MGRISV = "mgrIsv";
    public static final String CONFIG_MODE_MGRAGENT = "mgrAgent";
    public static final String CONFIG_MODE_MGRMCH = "mgrMch";
    public static final String CONFIG_MODE_AGENTSELF = "agentSelf";
    public static final String CONFIG_MODE_AGENTSUBAGENT = "agentSubagent";
    public static final String CONFIG_MODE_AGENTEMCH = "agentMch";

    public static final String CONFIG_MODE_MGRAPPLYMENT = "mgrApplyment";
    public static final String CONFIG_MODE_AGENTAPPLYMENT = "agentApplyment";
    public static final String CONFIG_MODE_MCHAPPLYMENT = "mchApplyment";

    public static final String CONFIG_MODE_MCHSELFAPP1 = "mchSelfApp1"; // 普通
    public static final String CONFIG_MODE_MCHSELFAPP2 = "mchSelfApp2"; //特约

    private static final long serialVersionUID=1L;

    /**
     * 服务商/服务商/商户应用ID
     * @since 2024-01-15
     * 应用不再配置费率<br/>
     * 渠道商/服务商/用户ID
     */
    private String infoId;

    /**
     * 系统类型： 参考：SYS_TYPE
     * @since 2024-01-15
     * ISV / AGENT / MCH
     */
    private String infoType;

    /**
     * 费率关联渠道号
     */
    private String isvNo;

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

    /**
     * 支付方式代码
     */
    private String wayCode;

    /**
     * 进件是否显示（仅服务商配置）
     */
    private Byte applymentSupport;

    /**
     * 是否可编辑，1-可编辑；0-不可编辑
     * <p>
     *     若可编辑。<br/>
     *     那么设置一级代理，或者下级代理该费率时可以修改。
     * </p>
     * <p>
     *     若不可编辑，<br/>
     *     那么一级代理，此项费率值与渠道设置的模板费率保持一致；
     *     代理的费率与上级设置的模板费率保持一致
     * </p>
     */
    private Byte editable;

    /**
     * 冗余字段： 费率方式： SINGLE  LEVEL
     */
    private String feeType;

    /**
     * 冗余字段：单笔费率
     */
    private BigDecimal feeRate;

    /**
     * 费率配置 (参考： ApplymentBasicInfo.paywayFeeList)
     */
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private JSONObject paywayFeeDetail;

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

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

    /**
     * 0: 线下，
     * 1: 线上
     */
    @TableField("`range`")
    private Integer range;

    /**
     * 业务类型编码
     */
    private String mccCode;

}
