package com.red.circle.order.domain.order;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.red.circle.tool.core.json.JacksonUtils;
import lombok.Data;

import java.io.Serial;
import java.io.Serializable;

/**
 * MiFaPay支付回调通知实体
 *
 * @author system
 */
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class MiFaPayReceivePaymentNotice implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 内层通知数据（JSON字符串）
     */
    private String data;

    /**
     * 商户标识
     */
    private String merAccount;

    /**
     * 响应签名（平台私钥对 data 签名）
     */
    private String sign;

    /**
     * 解析后的内层数据
     */
    private MiFaPayNoticeData noticeData;

    /**
     * 反序列化
     */
    public static MiFaPayReceivePaymentNotice serializable(String json) {
        try {
            MiFaPayReceivePaymentNotice notice = JacksonUtils.readValue(json, MiFaPayReceivePaymentNotice.class);
            if (notice != null && notice.getData() != null) {
                notice.setNoticeData(JacksonUtils.readValue(notice.getData(), MiFaPayNoticeData.class));
            }
            return notice;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 内层通知数据结构
     */
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class MiFaPayNoticeData implements Serializable {

        @Serial
        private static final long serialVersionUID = 1L;

        /**
         * 平台唯一订单号（平台生成，唯一标识）
         */
        private String mbOrderId;

        /**
         * 银行或通道订单号（平台回调返回，用于幂等事件标识）
         */
        private String bankOrderNo;

        /**
         * 商户唯一订单号（与下单时传入的orderId一致，用于匹配商户本地订单）
         */
        private String orderId;

        /**
         * 支付用户ID（商户系统内用户唯一标识，与下单时传入的memberId一致）
         */
        private String memberId;

        /**
         * 订单金额（单位：分，如10000=100元，需与商户本地订单金额校验）
         */
        private String amount;

        /**
         * 交易币种（ISO 4217编码，与下单时传入的currency一致）
         */
        private String currency;

        /**
         * 下单时间（格式：yyyy-MM-dd HH:mm:ss，与下单接口返回的orderTime一致）
         */
        private String orderTime;

        /**
         * 支付时间（格式：yyyy-MM-dd HH:mm:ss；orderStatus=FAILED时可为空）
         */
        private String payTime;

        /**
         * 商品名称（与下单时productInfo中的productName一致）
         */
        private String product;

        /**
         * 订单状态：SUCCESS=交易成功，FAILED=交易失败
         */
        private String orderStatus;

        /**
         * 用户支付类型（与下单时传入的payType一致，未支付时可能为空）
         */
        private String payType;

        /**
         * 本地金额（单位：分，平台按汇率转换后的本地币种金额）
         */
        private String localAmount;

        /**
         * 本地交易币种（ISO 4217编码，如HKD/CNY等）
         */
        private String localCurrency;

        /**
         * 付款人卡片信息（JSON格式）
         */
        private String payerInfo;

        /**
         * 附加数据（下单时传入则原样返回，未传入则不返回）
         */
        private String attach;

        /**
         * 判断是否支付成功
         */
        public boolean isSuccess() {
            return "SUCCESS".equalsIgnoreCase(orderStatus);
        }

        /**
         * 判断是否支付失败
         */
        public boolean isFailed() {
            return "FAILED".equalsIgnoreCase(orderStatus);
        }
    }
}
