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

import com.wzj.soopin.transaction.enums.easypay.WxLimitPay;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 微信业务参数
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class WxBizParam {

    /**
     * 微信分配的公众账号ID，微信分配的公众账号ID（企业号corpid即为此appid）
     */
    private String appId;
    /**
     * 附加数据，在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据
     */
    private String attach;
    /**
     * 单品优惠功能字段
     */
    private Detail detail;
    /**
     * 订单优惠标记，用于区分订单是否可以享受优惠，字段内容在微信后台配置券时进行设置
     */
    private String goodsTag;
    /**
     * 实名信息
     */
    private WxBizParamIdentity identity;
    /**
     * 是否支持发票
     */
    private Boolean needReceip;
    /**
     * 用户标识
     */
    private String openId;
    /**
     * 商品描述
     */
    private String orderBody;
    /**
     * 微信场景信息，该字段用于上报场景信息，目前支持上报实际门店信息。该字段为JSON对象数据，对象格式为{"store_info":{"id": "门店ID","name":
     * "名称","area_code": "编码","address": "地址" }}
     */
    private SceneInfo sceneInfo;
    /**
     * 微信分配的子商户公众账号ID
     */
    private String subAppid;
    /**
     * 用户子标识，[点击查看获取openid](https://pay.weixin.qq.com/doc/v3/partner/4012081935)
     */
    private String subOpenId;
    /**
     * 交易限制支付类型
     */
    private WxLimitPay wxLimitPay;



    /**
     * 单品优惠功能字段
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class Detail {
        /**
         * 订单原价，1.商户侧一张小票订单可能被分多次支付，订单原价用于记录整张小票的交易金额。<br />2.当订单原价与支付金额不相等，则不享受优惠。<br
         * />3.该字段主要用于防止同一张小票分多次支付，以享受多次优惠的情况，正常支付订单不必上传此参数。
         */
        private Long costPrice;
        /**
         * 单品列表，单品信息，使用Json数组格式提交
         */
        private List<GoodsDetail> goodsDetail;
        /**
         * 商家小票ID，商家小票ID
         */
        private String receiptid;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class GoodsDetail {
        /**
         * 商品编码，由半角的大小写字母、数字、中划线、下划线中的一种或几种组成
         */
        private String goodsid;
        /**
         * 商品名称，商品的实际名称
         */
        private String goodsName;
        /**
         * 商品单价，单位为：分。如果商户有优惠，需传输商户优惠后的单价(例如：用户对一笔100元的订单使用了商场发的优惠券100-50，则活动商品的单价应为原单价-50)
         */
        private Long price;
        /**
         * 商品数量，用户购买的数量
         */
        private Long quantity;
        /**
         * 微信侧商品编码，微信支付定义的统一商品编号（没有可不传）
         */
        private String wxpayGoodsid;
    }

    /**
     * 实名信息
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class WxBizParamIdentity {
        /**
         * 证件号
         */
        private String certNo;
        /**
         * 证件类型
         */
        private String certType;
        /**
         * 数字信封
         */
        private String dgtlEnvlp;
        /**
         * 手机号
         */
        private String mobile;
        /**
         * 姓名
         */
        private String name;
    }

    /**
     * 微信场景信息，该字段用于上报场景信息，目前支持上报实际门店信息。该字段为JSON对象数据，对象格式为{"store_info":{"id": "门店ID","name":
     * "名称","area_code": "编码","address": "地址" }}
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class SceneInfo {
        /**
         * 商户端设备号，商户端设备号
         */
        private String deviceid;
        /**
         * 用户的客户端IP，用户的客户端IP
         */
        private String payerClientip;
        /**
         * 门店信息，门店信息
         */
        private StoreInfo storeInfo;
    }

    /**
     * 门店信息，门店信息
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class StoreInfo {
        /**
         * 门店详细地址，门店详细地址
         */
        private String address;
        /**
         * 门店所在地行政区划码，门店所在地行政区划码
         */
        private String areaCode;
        /**
         * 门店唯一标识，门店唯一标识
         */
        private String id;
        /**
         * 门店名称，门店名称
         */
        private String name;
    }

}
