package com.infoepoch.pms.agent.platform.shared.observation;

import lombok.Getter;

import java.time.LocalDateTime;

/**
 * 工具调用轨迹事件。
 */
@Getter
public class ToolExecutionTraceEvent {

    /** 事件类型。 */
    private final String type;

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

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

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

    /** 工具执行状态。 */
    private final String toolStatus;

    /** 工具入参。 */
    private final String toolInput;

    /** 工具返回值。 */
    private final String toolOutput;

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

    /** 事件创建时间。 */
    private final LocalDateTime createdAt;

    /** 工具开始时间。 */
    private final LocalDateTime startedAt;

    /** 工具结束时间。 */
    private final LocalDateTime finishedAt;

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

    private ToolExecutionTraceEvent(String type, String toolCallId, String toolName, String toolDisplayName,
                                    String toolStatus, String toolInput, String toolOutput, String node,
                                    LocalDateTime startedAt, LocalDateTime finishedAt, String errorMessage) {
        this.type = type;
        this.toolCallId = toolCallId;
        this.toolName = toolName;
        this.toolDisplayName = toolDisplayName;
        this.toolStatus = toolStatus;
        this.toolInput = toolInput;
        this.toolOutput = toolOutput;
        this.node = node;
        this.createdAt = LocalDateTime.now();
        this.startedAt = startedAt;
        this.finishedAt = finishedAt;
        this.errorMessage = errorMessage;
    }

    /**
     * 创建工具执行中事件。
     */
    public static ToolExecutionTraceEvent running(String toolCallId, String toolName, String toolDisplayName,
                                                  String toolInput, String node) {
        LocalDateTime now = LocalDateTime.now();
        return new ToolExecutionTraceEvent("tool_running", toolCallId, toolName, toolDisplayName,
                "running", toolInput, null, node, now, null, null);
    }

    /**
     * 创建工具执行完成事件。
     */
    public static ToolExecutionTraceEvent finished(String toolCallId, String toolName, String toolDisplayName,
                                                   String toolInput, String toolOutput, String node) {
        LocalDateTime now = LocalDateTime.now();
        return new ToolExecutionTraceEvent("tool_finished", toolCallId, toolName, toolDisplayName,
                "finished", toolInput, toolOutput, node, null, now, null);
    }

    /**
     * 创建工具执行失败事件。
     */
    public static ToolExecutionTraceEvent failed(String toolCallId, String toolName, String toolDisplayName,
                                                 String toolInput, String toolOutput, String node) {
        LocalDateTime now = LocalDateTime.now();
        return new ToolExecutionTraceEvent("tool_failed", toolCallId, toolName, toolDisplayName,
                "failed", toolInput, toolOutput, node, null, now, toolOutput);
    }
}
