package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;

import com.wzj.soopin.transaction.enums.easypay.IDCheckIn;
import com.wzj.soopin.transaction.enums.easypay.LimitCreditPay;
import com.wzj.soopin.transaction.enums.easypay.PayChannel;
import com.wzj.soopin.transaction.enums.easypay.QrCodeType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 银联业务参数
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class QrBizParam {

    /**
     * AcqAddnData
     */
    private AcqAddnData acqAddnData;
    /**
     * 微信分配的公众账号ID，payType=UnionPayJsMini时必填，上送调起云闪付微信小程序的微信APPID
     */
    private String appid;
    /**
     * 银联支付标识，payType=UnionPayJsMini时必填，固定上送MicroMessenger
     */
    private String appUpIdentifier;
    /**
     * 地区信息，7位，1-3为国家代码，境内业务统一为“156”，4-7位为地区码，采用《银联卡跨行业务地区代码标准》。境外商户受理的二维码业务，地区代码用全0 填充。 点击
     * [地区码](https://www.yuque.com/pandans/ws1g9s/loa46fu6isbvoksz#n3L1v)
     * <p>
     * 例：上海市——上海市——浦东新区 则传 1562904
     */
    private String areaInfo;
    /**
     * 优惠码
     */
    private String discountCode;
    /**
     * 前台失败通知地址，与frontUrl同时出现。
     * APP侧未成功完成支付时调
     * 用，银联将通过GET方式访问
     * 本地址，银联将在frontFailUrl
     * 后附加付款中止原因码，原因
     * 码error_code取值如下：
     * 01 - APP付款失败
     * 91 - 用户取消支付
     */
    private String frontFailUrl;
    /**
     * 前台通知地址
     */
    private String frontUrl;
    /**
     * 实名支付验证标识
     */
    private IDCheckIn idCheckIn;
    /**
     * 实名支付验证地址，当idCheckIn 取值为“1”时出现
     */
    private String idCheckUrl;
    /**
     * UnionIdentity
     */
    private QrBizParamIdentity identity;
    /**
     * 禁用支付渠道
     */
    private LimitCreditPay limitCreditPay;
    /**
     * 商户交易索引，若商户必须使用自身交易索引，且无法使用orderNo作为交易主键发起撤销、退货交易时出现。
     */
    private String merTransIndex;
    /**
     * 是否支持发票
     */
    private String needReceipt;
    /**
     * 支付方式，payType=UnionPayJsMini时必填
     */
    private PayChannel payChannel;
    /**
     * PayeeInfo
     */
    private PayeeInfo payeeInfo;
    /**
     * 支付有效时间，允许对一个订单进行支付的最长相对时间，单位为秒。
     */
    private long paymentValidTime;
    /**
     * 银联服务商信息，json格式，参数值示例如下：
     * <p>
     * {"pnrOrderId":"1220250321034502483875104", "pidSct" :"lj8352@da099%ldang", "tradeScene"
     * :"1"}
     */
    private String pidInfo;
    /**
     * 二维码，payType=UnionPayJsapi、UnionPayJsMini时必填。
     * 二维码表示的数据，内容为特定格式的URL或TLV。其中境内二维码采用URL格式，境外二维码采用TLV格式。见附录F21.
     */
    private String qrCode;
    /**
     * 二维码类型，payType=UnionPayJsapi、UnionPayJsMini时必填。
     */
    private QrCodeType qrCodeType;
    /**
     * 银联服务商机构标识码，这是银联的渠道商号，类似微信渠道商号24006513
     */
    private String qrPnrInsIdCd;
    /**
     * 请求方自定义域
     */
    private String reqReserved;
    /**
     * 交易类型，参考
     * [附录F1.2](https://apifox.com/apidoc/shared/9758ecc8-2c38-4ec6-914f-b09be6f563bc/doc-5524664)
     */
    private String transType;
    /**
     * 授权码
     */
    private String userAuthCode;
    /**
     * 用户标识，对应旧系统的payerId
     */
    private String userId;


    /**
     * AcqAddnData
     */
    @lombok.Data
    public static class AcqAddnData {
        /**
         * 自定义数据
         */
        private String customData;
        /**
         * 商品信息，商品明细内容
         */
        private List<GoodsInfo> goodsInfos;
        /**
         * QrOrderInfo
         */
        private OrderInfo orderInfo;
    }

    /**
     * QrGoodsInfo，白条支付下，如涉及贴息信息，可在本参数下上送信息，参数说明详见F22
     */
    @Data
    public static class GoodsInfo {
        /**
         * 商品简述信息
         */
        private String body;
        /**
         * 商品类目树
         */
        private String categoriesTree;
        /**
         * 商品类目
         */
        private String goodsCategory;
        /**
         * 商品编号
         */
        private String goodsId;
        /**
         * 商品名称
         */
        private String goodsName;
        /**
         * 商品单价
         */
        private long price;
        /**
         * 商品数量
         */
        private long quantity;
        /**
         * 商品的展示地址
         */
        private String showUrl;
        /**
         * 支付宝定义的统一商品编号
         * 第三方商品编号
         */
        private String thirdGoodsId;
    }

    /**
     * QrOrderInfo
     */
    @Data
    public static class OrderInfo {
        /**
         * 附件信息
         * <p>
         * 如需京东白条支付，可在此参数下上送白条相应参数，详细参数见附录F22
         */
        private String addnInfo;
        /**
         * 可优惠金额
         */
        private String dctAmount;
        /**
         * 订单描述
         */
        private String description;
        /**
         * 订单标题
         */
        private String title;
    }

    /**
     * UnionIdentity
     */
    @lombok.Data
    public static class QrBizParamIdentity {
        /**
         * 证件号
         */
        private String certNo;
        /**
         * 证件类型
         */
        private String certType;
        /**
         * 数字信封
         */
        private String dgtlEnvlp;
        /**
         * 手机号
         */
        private String mobile;
        /**
         * 证件姓名
         */
        private String name;
    }

    /**
     * PayeeInfo
     */
    @lombok.Data
    public static class PayeeInfo {
        /**
         * 商户类别
         */
        private String mchtMccCode;
        /**
         * 商户英文名称
         */
        private String nameEng;
        /**
         * 收款方账号
         */
        private String payeeAcctNo;
        /**
         * 账号类型
         */
        private String payeeAcctType;
        /**
         * 二级商户代码
         */
        private String subMchtCode;
        /**
         * 二级商户名称
         */
        private String subMchtName;
    }

}
