package com.infoepoch.pms.agent.platform.chat.domain;

import com.infoepoch.pms.agent.platform.shared.observation.ToolExecutionTraceEvent;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDateTime;

/**
 * 工具调用轨迹时间线条目。
 */
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class TraceTimelineItem {

    /**
     * 工具调用 ID。
     */
    private String toolCallId;

    /**
     * 工具名称。
     */
    private String toolName;

    /**
     * 工具展示名称。
     */
    private String toolDisplayName;

    /**
     * 执行状态：running / finished / failed。
     */
    private String status;

    /**
     * 节点名称。
     */
    private String node;

    /**
     * 工具开始时间。
     */
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private LocalDateTime startedAt;

    /**
     * 工具结束时间。
     */
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private LocalDateTime finishedAt;

    /**
     * 工具入参。
     */
    private String input;

    /**
     * 工具返回值。
     */
    private String output;

    /**
     * 错误信息。
     */
    private String errorMessage;

    /**
     * 从轨迹事件创建时间线条目。
     *
     * @param event 工具调用轨迹事件
     * @return 时间线条目
     */
    public static TraceTimelineItem fromEvent(ToolExecutionTraceEvent event) {
        TraceTimelineItem item = new TraceTimelineItem();
        item.toolCallId = event.getToolCallId();
        item.toolName = event.getToolName();
        item.toolDisplayName = event.getToolDisplayName();
        item.status = event.getToolStatus();
        item.node = event.getNode();
        item.startedAt = event.getStartedAt();
        item.finishedAt = event.getFinishedAt();
        item.input = event.getToolInput();
        item.output = event.getToolOutput();
        item.errorMessage = event.getErrorMessage();
        return item;
    }

    /**
     * 合并两个同 toolCallId 的条目（running + finished/failed）。
     * <p>
     * running 事件携带 startedAt，finished/failed 事件携带 finishedAt。
     * 合并后保留最早的 startedAt 和最晚的 finishedAt。
     * </p>
     *
     * @param other 另一个同 toolCallId 的条目
     * @return 合并后的当前对象
     */
    public TraceTimelineItem merge(TraceTimelineItem other) {
        this.status = other.status;
        this.node = other.node;
        this.input = other.input;
        this.output = other.output;
        this.errorMessage = other.errorMessage;
        if (this.startedAt == null) {
            this.startedAt = other.startedAt;
        }
        if (other.finishedAt != null) {
            this.finishedAt = other.finishedAt;
        }
        return this;
    }
}
