package com.sptg.pay.api.vendor.wxPay.data.unifiedorder;

import com.sptg.pay.api.entity.PayChannelConfig;
import com.sptg.pay.api.vendor.wxPay.validate.WxPayDataValidate;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 统一下单：参数对象：必填参数
 */
@Data
@NoArgsConstructor
public class UnifiedOrder implements WxPayDataValidate {

    /**
     * App ID
     */
    private String appid;

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

    /**
     * 随机字符串：随机字符串，长度要求在32位以内
     */
    private String nonce_str;

    /**
     * 签名：通过签名算法计算得出的签名值
     */
    private String sign = "";

    /**
     * 商品描述：商品简单描述，该字段请按照规范传递
     */
    private String body;

    /**
     * 商户订单号：商户系统内部订单号，要求32个字符内，只能是数字、大小写字母_-|*@ ，且在同一个商户号下唯一
     */
    private String 	out_trade_no;

    /**
     * 标价金额（int）：订单总金额，单位为分
     */
    private String total_fee;

    /**
     * 终端IP：APP和网页支付提交用户端ip，Native支付填调用微信支付API的机器IP
     */
    private String spbill_create_ip;

    /**
     * 通知地址：异步接收微信支付结果通知的回调地址，通知url必须为外网可访问的url，不能携带参数
     */
    private String notify_url;

    /**
     * 交易类型：取值如下：JSAPI（公众号支付），NATIVE（原生扫码支付），APP（app支付）等
     */
    private String trade_type;

    /**
     * 商品ID。trade_type=NATIVE时（即扫码支付），此参数必传。此参数为二维码中包含的商品ID，商户自行定义。
     */
    private String product_id;

    /**
     * 构造统一下单数据
     * @param config 支付配置
     * @param businessData 业务数据
     */
    public UnifiedOrder(PayChannelConfig config, UnifiedBusinessData businessData) {
        this.appid = config.getAppId();
        this.mch_id = config.getMchId();
        this.notify_url = config.getNotifyUrl();

        // 业务数据域
        if (!businessData.validate()) {
            // 业务数据校验
            throw new IllegalArgumentException("UnifiedBusinessData invalidate!");
        }
        this.body = businessData.getBody();
        this.out_trade_no = businessData.getOut_trade_no();
        this.total_fee = businessData.getTotal_fee();
        this.spbill_create_ip = businessData.getSpbill_create_ip();
        this.trade_type = businessData.getTrade_type();
        this.product_id = businessData.getProduct_id();
    }

    @Override
    public boolean validate() {
        return hasText(appid)
                && hasText(mch_id)
                && hasText(nonce_str)
                // && hasText(sign)// SDK 自动计算sign
                && hasText(notify_url);
    }
}
