package com.spot.dto.mq;

import com.spot.utils.TimeUtils;
import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 成交记录DTO，由撮合引擎产生，包含一次完整撮合的双方信息
 *
 * @author jean
 * @date 2026-05-06
 */
@Data
public class TradeRecord implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 成交ID（时间戳+随机数）
     */
    private String tradeId;

    /**
     * 交易对
     */
    private String symbol;

    /**
     * 吃单订单ID
     */
    private Long takerOrderId;

    /**
     * 挂单订单ID
     */
    private Long makerOrderId;

    /**
     * 吃单用户ID
     */
    private Integer takerUserId;

    /**
     * 挂单用户ID
     */
    private Integer makerUserId;

    /**
     * 成交价格
     */
    private BigDecimal tradePrice;

    /**
     * 成交数量（基础币）
     */
    private BigDecimal tradeVolume;

    /**
     * 成交金额（计价币）
     */
    private BigDecimal tradeAmount;

    /**
     * 吃单方向：BUY / SELL
     */
    private String takerSide;

    /**
     * 挂单方向：BUY / SELL
     */
    private String makerSide;

    /**
     * 成交时间
     */
    private LocalDateTime tradeTime;

    /**
     * 吃单方手续费
     */
    private BigDecimal takerFee;

    /**
     * 挂单方手续费
     */
    private BigDecimal makerFee;

    public TradeRecord() {
        this.tradeTime = TimeUtils.now();
        this.tradeId = generateTradeId();
    }

    /**
     * 计算成交金额 = 成交价格 × 成交数量
     */
    public void calculateTradeAmount() {
        if (this.tradePrice != null && this.tradeVolume != null) {
            this.tradeAmount = this.tradePrice.multiply(this.tradeVolume);
        }
    }

    /** 生成唯一成交ID */
    private String generateTradeId() {
        return TimeUtils.currentUtcTimestamp() + "_" + (int) (Math.random() * 1000);
    }
}
