package com.ghy.common.adapay.model;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;

/**
 * 支付参数
 *
 * @author HH 2022/5/12
 */
@Data
public class PayParam {

    /**
     * 请求订单号，只能为英文、数字或者下划线的一种或多种组合，保证在app_id下唯一
     */
    @JSONField(name = "order_no")
    private String orderNo;
    /**
     * 交易金额，必须大于0，保留两位小数点，如0.10、100.05等
     */
    @JSONField(name = "pay_amt")
    private String payAmt;
    /**
     * 支付模式，delay- 延时分账模式（值为 delay 时，div_members 字段必须为空）；
     * 值为空时并且div_members不为空时，表示实时分账；
     * 值为空时并且div_members也为空时，表示不分账；
     */
    @JSONField(name = "pay_mode")
    private String payMode;
    /**
     * 商品标题
     */
    @JSONField(name = "goods_title")
    private String goodsTittle;
    /**
     * 商品描述信息，微信小程序和微信公众号该字段最大长度42个字符
     */
    @JSONField(name = "goods_desc")
    private String goodsDesc;
    /**
     * 订单附加说明 最大长度128个字符
     */
    private String description;
    /**
     * 订单失效时间，输入格式：yyyyMMddHHmmss，最长失效时间为微信、支付宝：反扫类：3分钟；非反扫类：2小时；
     * 云闪付：1天，值为空时默认最长时效时间
     */
    @JSONField(name = "time_expire")
    private String timeExpire;
    /**
     * 手续费收取模式：O-商户手续费账户扣取手续费，I-交易金额中扣取手续费；值为空时，默认值为I；
     * 若为O时，分账对象列表中不支持传入手续费承担方
     */
    @JSONField(name = "fee_mode")
    private String feeMode;

    /**
     * 包含所有[必填参数]的构造器，其它参数按需set
     *
     * @param orderNo     [必填项]请求订单号，只能为英文、数字或者下划线的一种或多种组合，保证在app_id下唯一
     * @param payAmt      [必填项]交易金额，必须大于0，保留两位小数点，如"0.10"、"100.05"
     * @param goodsTittle [必填项]商品名称
     * @param goodsDesc   [必填项]商品描述信息，微信小程序和微信公众号该字段最大长度42个字符
     */
    public PayParam(String orderNo, String payAmt, String goodsTittle, String goodsDesc) {
        boolean noneBlank = StringUtils.isNoneBlank(orderNo, payAmt, goodsTittle, goodsDesc);
        Assert.isTrue(noneBlank, "PayParam [orderNo, payChannel, payAmt, goodsTittle, goodsDesc] cannot be empty!");
        this.orderNo = orderNo;
        this.payAmt = payAmt;
        this.goodsTittle = goodsTittle;
        this.goodsDesc = goodsDesc;
    }

    public JSONObject toJSONObject() {
        String jsonString = JSON.toJSONString(this);
        return JSON.parseObject(jsonString);
    }

    /**
     * 构造一个延迟分账的支付参数
     *
     * @param orderNo     [必填项]请求订单号，只能为英文、数字或者下划线的一种或多种组合，保证在app_id下唯一
     * @param payAmt      [必填项]交易金额，必须大于0，保留两位小数点，如"0.10"、"100.05"
     * @param goodsTittle [必填项]商品名称
     * @param goodsDesc   [必填项]商品描述信息，微信小程序和微信公众号该字段最大长度42个字符
     * @return 支付参数
     */
    public static PayParam delayPayParam(String orderNo, String payAmt, String goodsTittle, String goodsDesc) {
        PayParam payParam = new PayParam(orderNo, payAmt, goodsTittle, goodsDesc);
        payParam.setPayMode("delay");
        return payParam;
    }
}
