package com.spot.dto.mq;

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

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

/**
 * 撮合引擎交易结果DTO，包含吃单/挂单订单及成交明细
 *
 * @author jean
 * @date 2026-05-06
 */
@Data
public class TradeResult implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 是否撮合成功
     */
    private boolean matched = false;

    /**
     * 是否为撤单操作
     */
    private boolean canceled = false;

    /**
     * 吃单订单（新进入的主动订单）
     */
    private ExOrder takerOrder;

    /**
     * 挂单订单（被动挂单，每次只撮合一单）
     */
    private ExOrder makerOrder;

    /**
     * 成交记录（每次撮合只产生一条）
     */
    private TradeRecord tradeRecord;

    /**
     * 是否完全成交
     */
    private boolean fullyFilled = false;

    /**
     * 撮合时间
     */
    private LocalDateTime matchTime;

    /**
     * 消息ID（用于幂等处理）
     */
    private String messageId;

    /**
     * 构建撤单结果
     *
     * @param canceledOrder 被撤销的订单
     * @return 撤单 TradeResult
     */
    public static TradeResult createCancelResult(ExOrder canceledOrder) {
        TradeResult result = new TradeResult();
        result.canceled = true;
        result.matched = false;
        result.takerOrder = canceledOrder;
        result.matchTime = TimeUtils.now();
        return result;
    }
}
