package com.czg.entity;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSONObject;
import lombok.Data;

/**
 * @author ww
 */
@Data
public class PolyBaseReq {

    /**
     * 应用ID tb_shop_merchant 表中的 app_id
     */
    private String appId;

    /**
     * 签名
     * MD5（  appSecret 参数不做排序 直接放末尾）
     * 加签字符串拼接方式为字段名 = 字段值并用&符号连接，需要按照既定排序方式相连，并且在末端连接 appSecret=xxx，
     * 使用 MD5 加签时，验签时使用同样的方式加签对比签名值即可
     * <p>
     * RSA2
     * 加签字符串拼接方式为字段名=字段值并用 & 符号连接，使用应用私钥对该拼接串进行签名
     */
    private String sign;

    /**
     * 签名方式
     * 可选值 MD5、RSA2
     */
    private String signType = "MD5";

    /**
     * 业务数据
     * JSON 形式的字符串
     */
    private String bizData;

    /**
     * 版本号 目前固定 1.0
     */
    private String version = "1.0";

    /**
     * 请求时间 格式为 yyyyMMddHHmmss
     */
    private String reqTime = DateUtil.format(new DateTime(), DatePattern.PURE_DATETIME_PATTERN);

    /**
     * 唯一请求 Id String(40)
     */
    private String reqId = IdUtil.simpleUUID();

    /**
     * 应用密钥 tb_shop_merchant 表中的 app_secret
     */
    private String appSecret;

    /**
     * 必填字段
     *
     * @param appId     应用id tb_shop_merchant 表中的 app_id
     * @param appSecret 应用密钥 tb_shop_merchant 表中的 app_secret
     * @param bizData   JSON 形式的字符串
     */
    public PolyBaseReq(String appId, String bizData, String appSecret) {
        this.appId = appId;
        this.bizData = bizData;
        this.appSecret = appSecret;
    }

    /**
     * 必填字段
     *
     * @param appId     应用id tb_shop_merchant 表中的 app_id
     * @param appSecret 应用密钥 tb_shop_merchant 表中的 app_secret
     * @param bizData   JSON 形式的字符串
     */
    public static PolyBaseReq getInstance(String appId, String appSecret, Object bizData) {
        return new PolyBaseReq(appId, ObjectUtil.isNotEmpty(bizData) ? JSONObject.toJSONString(bizData) : "", appSecret);
    }

}
