package com.infoepoch.pms.agent.platform.chat.application.dto;

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

import java.time.LocalDateTime;
import java.util.List;

/**
 * 对话流式输出事件。
 */
@Getter
public class ChatStreamEventResponse {

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

    /**
     * 事件内容。
     */
    private final String content;

    /**
     * 产生事件的节点名称。
     */
    private final String node;

    /**
     * 对话状态，仅完成事件返回。
     */
    private final String status;

    /**
     * 工具调用 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;

    /**
     * 事件创建时间。
     */
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private final LocalDateTime createdAt;

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

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

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

    /**
     * 会话 ID。
     */
    private final String sessionId;

    /**
     * 审批中断 ID。
     */
    private final String interruptionId;

    /**
     * 审批动作类型。
     */
    private final String actionType;

    /**
     * 审批智能体名称。
     */
    private final String agentName;

    /**
     * 审批智能体数据库 ID。
     */
    private final String agentId;

    /**
     * 审批摘要字段。
     */
    private final List<PendingApprovalResponse.FieldItem> summaryFields;

    /**
     * 创建流式事件。
     *
     * @param type    事件类型
     * @param content 事件内容
     * @param node    节点名称
     * @param status  对话状态
     */
    public ChatStreamEventResponse(String type, String content, String node, String status) {
        this(type, content, node, status, null, null, null, null, null,
                null, null, null, null, null,
                null, null, null, null, null, null);
    }

    /**
     * 创建扩展流式事件。
     */
    public ChatStreamEventResponse(String type, String content, String node, String status,
                                   String toolCallId, String toolName, String toolDisplayName,
                                   String toolStatus, String toolInput, String toolOutput,
                                   LocalDateTime createdAt, LocalDateTime startedAt,
                                   LocalDateTime finishedAt, String errorMessage,
                                   String sessionId, String interruptionId, String actionType,
                                   String agentName, String agentId,
                                   List<PendingApprovalResponse.FieldItem> summaryFields) {
        this.type = type;
        this.content = content;
        this.node = node;
        this.status = status;
        this.toolCallId = toolCallId;
        this.toolName = toolName;
        this.toolDisplayName = toolDisplayName;
        this.toolStatus = toolStatus;
        this.toolInput = toolInput;
        this.toolOutput = toolOutput;
        this.createdAt = createdAt;
        this.startedAt = startedAt;
        this.finishedAt = finishedAt;
        this.errorMessage = errorMessage;
        this.sessionId = sessionId;
        this.interruptionId = interruptionId;
        this.actionType = actionType;
        this.agentName = agentName;
        this.agentId = agentId;
        this.summaryFields = summaryFields;
    }

    /**
     * 由工具轨迹事件创建流式事件。
     */
    public static ChatStreamEventResponse fromToolTrace(ToolExecutionTraceEvent traceEvent) {
        return new ChatStreamEventResponse(traceEvent.getType(), null, traceEvent.getNode(), null,
                traceEvent.getToolCallId(), traceEvent.getToolName(), traceEvent.getToolDisplayName(),
                traceEvent.getToolStatus(), traceEvent.getToolInput(), traceEvent.getToolOutput(),
                traceEvent.getCreatedAt(), traceEvent.getStartedAt(), traceEvent.getFinishedAt(),
                traceEvent.getErrorMessage(), null, null, null, null, null, null);
    }

    /**
     * 创建审批中断事件。
     *
     * @param node           节点名称
     * @param sessionId      会话 ID
     * @param interruptionId 中断 ID
     * @param actionType     审批动作类型
     * @param agentName      审批智能体名称
     * @param agentId        审批智能体数据库 ID
     * @param summaryFields  审批摘要字段
     * @return 审批中断事件
     */
    public static ChatStreamEventResponse approvalRequired(
            String node,
            String sessionId,
            String interruptionId,
            String actionType,
            String agentName,
            String agentId,
            List<PendingApprovalResponse.FieldItem> summaryFields) {
        return new ChatStreamEventResponse("approval_required", null, node, "pending",
                null, null, null, null, null, null, null, null, null, null,
                sessionId, interruptionId, actionType, agentName, agentId, summaryFields);
    }
}
