package com.czg.dto.req;

import com.alibaba.fastjson2.JSONObject;
import com.czg.PayCst;
import com.czg.exception.CzgException;
import com.czg.pay.AlipayAuthInfoDto;
import com.czg.utils.AssertUtil;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 支付参数
 *
 * @author yjjie
 * @date 2026/1/9 11:12
 */
@Data
@Accessors(chain = true)
public class PayParamsDto {

    /**
     * 【必填】
     * 支付方式
     * {@link com.czg.PayCst.Platform}
     */
    private String platform;

    /**
     * 【必填】
     * 订单号
     */
    private String orderNo;

    /**
     * 【必填】
     * 金额，单位：分
     */
    private Long amount;

    /**
     * 【必填】
     * 订单标题
     */
    private String title;

    /**
     * 【必填】
     * 回调地址
     */
    private String notifyUrl;

    /**
     * 【必填】
     * appId
     */
    private String appId;

    /**
     * 用户唯一标识
     */
    private String openId;

    /**
     * 【微信必填】
     * 商户ID
     */
    private String merchantId;

    /**
     * 【支付宝必填】
     * 支付参数
     */
    private String payParams;

    /**
     * 商品描述
     */
    private String body;

    /**
     * 扩展数据
     */
    private String extData;

    /**
     * 设备 ip
     */
    private String clientIp;

    /**
     * 支付条码
     * 微信：18位纯数字，前缀以10、11、12、13、14、15开头
     */
    private String barCode;

    /**
     * 支付宝 授权信息解析，不用传
     */
    private AlipayAuthInfoDto alipayAuthInfo;

    public void verifyParams() {
        AssertUtil.isBlank(platform, "请选择支付方式");
        AssertUtil.isBlank(orderNo, "订单号不能为空");
        AssertUtil.isBlank(title, "订单标题不能为空");
        AssertUtil.isBlank(notifyUrl, "回调地址不能为空");
        AssertUtil.isBlank(appId, "appId不能为空");
        AssertUtil.isBlank(openId, "用户唯一标识不能为空");

        if (PayCst.Type.WECHAT.equals(platform)) {
            AssertUtil.isBlank(merchantId, "商户ID不能为空");
        } else if (PayCst.Type.ALIPAY.equals(platform)) {
            AssertUtil.isBlank(payParams, "支付参数不能为空");
            alipayAuthInfo = JSONObject.parseObject(payParams, AlipayAuthInfoDto.class);
            AssertUtil.isNull(alipayAuthInfo, "支付参数错误");
            AssertUtil.isBlank(alipayAuthInfo.getAppAuthToken(), "授权信息错误");
        } else {
            throw new CzgException("支付平台错误");
        }
    }
}
