package com.red.circle.order.app.common;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.red.circle.tool.core.json.JacksonUtils;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serial;
import java.io.Serializable;
import java.util.List;

/**
 * MiFaPay下单请求参数
 *
 * @author system
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MiFaPayPlaceAnOrderParam implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    // ==================== 必填字段 ====================

    /**
     * 商户编号（平台分配）
     */
    private String merNo;

    /**
     * 商户订单号
     */
    private String orderId;

    /**
     * 用户唯一标识（商户系统内用户ID）
     */
    private String memberId;

    /**
     * 请求时间戳
     */
    private Long time;

    /**
     * 订单金额（单位：分，如 1000000=10000 USD，不能携带小数点）
     */
    private String amount;

    /**
     * 币种代码（ISO 4217）
     */
    private String currency;

    /**
     * 支付方式（如 BankTransfer/Ewallet）
     */
    private String payWay;

    /**
     * 支付类型（如 LinePay/Dana）
     */
    private String payType;

    /**
     * 用户IP地址
     */
    private String userIp;

    /**
     * 支付完成后前端跳转地址
     */
    private String returnUrl;

    /**
     * 支付结果异步通知地址
     */
    private String notifyUrl;

    /**
     * 页面语言
     */
    private String language;

    /**
     * 用户邮箱
     */
    private String email;

    /**
     * 国家/地区编码
     */
    private String countryCode;

    /**
     * 用户名字（名）
     */
    private String firstName;

    /**
     * 用户姓氏（姓）
     */
    private String lastName;

    /**
     * 用户手机号
     */
    private String phone;

    /**
     * 商品信息（JSON数组字符串）
     */
    private String productInfo;

    /**
     * 终端类型（WEB/WAP）
     */
    private String terminalType;

    // ==================== 非必填字段 ====================

    /**
     * 系统类型（IOS/ANDROID，默认为WAP）
     */
    private String osType;

    /**
     * 结算币种（ISO 4217）
     */
    private String settlementCurrency;

    /**
     * 信用卡3DS校验，默认开启（'1'开启 '0'关闭）
     */
    private String is3DSAuthentication;

    /**
     * 付款人参数（JSON格式）
     */
    private String paymentInfo;

    /**
     * 国际银行账户号码
     */
    private String iban;

    /**
     * 附加数据（查询API和支付通知中原样返回）
     */
    private String attach;

    /**
     * 账单地址信息（JSON格式）
     */
    private BillingInfo billingInfo;

    /**
     * 配送地址信息（JSON格式）
     */
    private ShippingInfo shippingInfo;

    /**
     * 支付卡信息（加密后，JSON格式）
     */
    private PayerInfo payerInfo;

    // ==================== 内部类 ====================

    /**
     * 商品信息
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class ProductInfo implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L;

        /**
         * 商品SKU
         */
        private String sku;

        /**
         * 商品名称
         */
        private String productName;

        /**
         * 商品价格（单位：分）
         */
        private String price;

        /**
         * 商品数量
         */
        private String quantity;
    }

    /**
     * 付款人信息
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class PaymentInfo implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L;

        /**
         * 用户类型
         */
        private String userType;

        /**
         * 用户标识
         */
        private String userIdentifier;
    }

    /**
     * 账单地址信息
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class BillingInfo implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L;

        /**
         * 地址
         */
        private String address;

        /**
         * 城市
         */
        private String city;

        /**
         * 邮政编码
         */
        private String postalCode;

        /**
         * 国家代码
         */
        private String country;
    }

    /**
     * 配送地址信息
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class ShippingInfo implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L;

        /**
         * 地址
         */
        private String address;

        /**
         * 城市
         */
        private String city;

        /**
         * 邮政编码
         */
        private String postalCode;

        /**
         * 国家代码
         */
        private String country;
    }

    /**
     * 支付卡信息
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class PayerInfo implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L;

        /**
         * 卡号（脱敏）
         */
        private String cardNo;

        /**
         * 卡组织（如VISA）
         */
        private String cardOrgn;
    }

    // ==================== 工具方法 ====================

    /**
     * 构建商品信息JSON字符串
     */
    public static String buildProductInfoJson(List<ProductInfo> products) {
        if (products == null || products.isEmpty()) {
            return null;
        }
        try {
            return JacksonUtils.toJson(products);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 构建付款人信息JSON字符串
     */
    public static String buildPaymentInfoJson(PaymentInfo paymentInfo) {
        if (paymentInfo == null) {
            return null;
        }
        try {
            return JacksonUtils.toJson(paymentInfo);
        } catch (Exception e) {
            return null;
        }
    }
}
