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

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Map;

/**
 * 支付宝业务参数
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class AliBizParam {

    /**
     * ali:商品详情列表，订单包含的商品列表信息，json格式。
     */
    private List<AliGoodsDetail> aliGoodsDetail;
    /**
     * 商户机具终端信息
     */
    private Map<String, Map<String, Object>> aliTerminalParams;
    /**
     * ali:商户传入业务信息，用于安全/营销等参数直传场景, json
     */
    private String businessParams;
    /**
     * 买家的支付宝唯一用户号，[点击查看获取userId](https://opendocs.alipay.com/open/02xtl7)
     */
    private String buyerId;
    /**
     * 买家支付宝账号
     */
    private String buyerLogonId;
    /**
     * ali:禁用支付渠道，逗号分隔
     * https://docs.open.alipay.com/common/wifww7，多个渠道以逗号分割，如同时禁用信用支付类型和积分，则disable_pay_channels="credit_group,point"https://docs.open.alipay.com/common/wifww7
     */
    private String disablePayChannels;
    /**
     * 可打折金额
     */
    private String discountableAmount;
    /** * 扩展参数，可传支付宝能力使用分期付款信息，格式为json字符串； * 1）信用卡分期格式： * { "fq_num" : "3" , "fq_seller_percent" : "0", "fq_channels " : "alipayfq_cc"} * 2）花呗分期格式： * { "hb_fq_num" : "3" , "hb_fq_seller_percent" : "0" } */
    private String extendParams;
    /**
     * 实名支付信息
     */
    private AliBizParamIdentity identity;
    /**
     * 商户操作员编号
     */
    private String operatorId;
    /**
     * 描述分账信息
     */
    private RoyaltyInfo royaltyInfo;
    /**
     * 卖家id
     */
    private String sellerId;
    /**
     * 商户门店编号
     */
    private String storeId;
    /**
     * 间联商户信息体
     */
    private SubMerchant subMerchant;
    /**
     * 不可打折金额
     */
    private String unDiscountableAmount;

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class AliGoodsDetail {

        /**
         * 支付宝定义的统一商品编号
         */
        private String alipayGoodsId;
        /**
         * 商品描述信息
         */
        private String body;
        /**
         * 商品类目树，从商品类目根节点到叶子节点的类目id组成，类目id值使用|分割
         */
        private String categoriesTree;
        /**
         * 商品类目
         */
        private String goodsCategory;
        /**
         * 商品的编号
         */
        private String goodsId;
        /**
         * 商品名称
         */
        private String goodsName;
        /**
         * 商品单价，单位：元
         */
        private Double price;
        /**
         * 商品数量
         */
        private Long quantity;
        /**
         * 商品的展示地址
         */
        private String showUrl;
    }

    /**
     * 实名支付信息
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class AliBizParamIdentity {

        /**
         * 证件号
         */
        private String certNo;
        /**
         * 证件类型，身份证： IDENTITY_CARD、 护照： PASSPORT 、 军 官 证 ： OFFICER_CARD 、 士 兵 证 ： SOLDIER_CARD、户口本：
         * HOKOU 等。 注： need_check_info=T 时 该参数才有 IDENTITY_CARD28 效
         */
        private String certType;
        /**
         * 数字信封，见2.4
         */
        private String dgtlEnvlp;
        /**
         * 是否强制校验付款人身份信息 ，T:强制校验， F：不强制
         */
        private String fixBuyer;
        /**
         * 允许的最小买家年龄，买家年龄必须大于等于所传数值，买家年龄必须大 于等于所传数值 注： 1. need_check_info=T 时该参数才有效 2. min_age
         * 为整数，必须大于等于 0
         */
        private Long minAge;
        /**
         * 手机号
         */
        private String mobile;
        /**
         * 姓名
         */
        private String name;
        /**
         * 是否强制校验身份信息，T:强制校验， F：不强制
         */
        private String needCheckInfo;
    }

    /**
     * 描述分账信息
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class RoyaltyInfo {

        /**
         * 分账明细的信息
         */
        private List<RoyaltyDetailInfo> royaltyDetailInfos;
        /**
         * 分账类型卖家的分账类型
         */
        private String royaltyType;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class RoyaltyDetailInfo {

        /**
         * 分账的金额
         */
        private long amount;
        /**
         * 分账的比例
         */
        private String amountPercentage;
        /**
         * 分账批次号
         */
        private String batchNo;
        /**
         * 分账描述信息
         */
        private String desc;
        /**
         * 商户分账的外部关联号
         */
        private String outRelationId;
        /**
         * 分账序列号
         */
        private String serialNo;
        /**
         * 如果转入账号类型为 userId，本参 数为接受分账金额的支付宝账号对应的支付宝唯一用户号
         */
        private String transIn;
        /**
         * 接受分账金额的账户类型
         */
        private String transInType;
        /**
         * 如果转出账号类型为 userId，本参数为要分账的支付宝账号对应的 支付宝唯一用户号
         */
        private String transOut;
        /**
         * 要分账的账户类型
         */
        private String transOutType;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class SubMerchant {

        /**
         * 间连受理商户的支付宝商户编号，间连受理商户的支付宝商户编号
         */
        private String merchantId;
        /**
         * 商户id类型，商户id类型
         */
        private String merchantType;
    }
}
