package com.easyagents.agui;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.agentscope.core.agui.model.AguiMessage;

import java.util.List;
import java.util.Objects;

/**
 * AgentScope 1.0.12 尚未提供的 AG-UI 标准线级事件。
 *
 * <p>该补充层只覆盖当前官方扩展缺失的标准事件，不复制 AG-UI 事件枚举。</p>
 */
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = AguiExtendedEvent.RunError.class, name = "RUN_ERROR"),
        @JsonSubTypes.Type(value = AguiExtendedEvent.MessagesSnapshot.class, name = "MESSAGES_SNAPSHOT")
})
public sealed interface AguiExtendedEvent
        permits AguiExtendedEvent.RunError, AguiExtendedEvent.MessagesSnapshot {

    /**
     * 运行失败事件。
     *
     * @param threadId AG-UI 线程 ID
     * @param runId AG-UI 运行 ID
     * @param message 可安全展示的错误消息
     * @param code 稳定错误码
     */
    record RunError(String threadId, String runId, String message, String code)
            implements AguiExtendedEvent {

        /**
         * 创建运行失败事件。
         *
         * @param threadId AG-UI 线程 ID
         * @param runId AG-UI 运行 ID
         * @param message 可安全展示的错误消息
         * @param code 稳定错误码
         */
        @JsonCreator
        public RunError(
                @JsonProperty("threadId") String threadId,
                @JsonProperty("runId") String runId,
                @JsonProperty("message") String message,
                @JsonProperty("code") String code) {
            this.threadId = Objects.requireNonNull(threadId, "threadId cannot be null");
            this.runId = Objects.requireNonNull(runId, "runId cannot be null");
            this.message = Objects.requireNonNull(message, "message cannot be null");
            this.code = code;
        }
    }

    /**
     * 消息全量快照事件。
     *
     * @param threadId AG-UI 线程 ID
     * @param runId AG-UI 运行 ID
     * @param messages 消息快照
     */
    record MessagesSnapshot(String threadId, String runId, List<AguiMessage> messages)
            implements AguiExtendedEvent {

        /**
         * 创建消息全量快照事件。
         *
         * @param threadId AG-UI 线程 ID
         * @param runId AG-UI 运行 ID
         * @param messages 消息快照
         */
        @JsonCreator
        public MessagesSnapshot(
                @JsonProperty("threadId") String threadId,
                @JsonProperty("runId") String runId,
                @JsonProperty("messages") List<AguiMessage> messages) {
            this.threadId = Objects.requireNonNull(threadId, "threadId cannot be null");
            this.runId = Objects.requireNonNull(runId, "runId cannot be null");
            this.messages = messages == null ? List.of() : List.copyOf(messages);
        }
    }
}
