package com.easyagents.agent.runtime.event;

import com.easyagents.agent.runtime.message.AgentMessage;

import java.time.Instant;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 智能体执行过程中的中立运行时事件。
 */
public class AgentRuntimeEvent {

    private String eventId = UUID.randomUUID().toString();
    private AgentRuntimeEventType eventType;
    private String traceId;
    private String sessionId;
    private String agentId;
    private String messageId;
    private String toolCallId;
    private AgentMessage message;
    private Map<String, Object> payload = new LinkedHashMap<>();
    private Map<String, Object> metadata = new LinkedHashMap<>();
    private Instant createdAt = Instant.now();

    /**
     * 创建指定类型的事件。
     *
     * @param eventType 事件类型
     * @return 新事件
     */
    public static AgentRuntimeEvent of(AgentRuntimeEventType eventType) {
        AgentRuntimeEvent event = new AgentRuntimeEvent();
        event.setEventType(eventType);
        return event;
    }

    /**
     * 获取事件ID。
     *
     * @return 事件ID
     */
    public String getEventId() {
        return eventId;
    }

    /**
     * 设置事件ID。
     *
     * @param eventId 事件ID
     */
    public void setEventId(String eventId) {
        this.eventId = eventId;
    }

    /**
     * 获取事件类型。
     *
     * @return 事件类型
     */
    public AgentRuntimeEventType getEventType() {
        return eventType;
    }

    /**
     * 设置事件类型。
     *
     * @param eventType 事件类型
     */
    public void setEventType(AgentRuntimeEventType eventType) {
        this.eventType = eventType;
    }

    /**
     * 获取链路ID。
     *
     * @return 链路ID
     */
    public String getTraceId() {
        return traceId;
    }

    /**
     * 设置链路ID。
     *
     * @param traceId 链路ID
     */
    public void setTraceId(String traceId) {
        this.traceId = traceId;
    }

    /**
     * 获取会话ID。
     *
     * @return 会话ID
     */
    public String getSessionId() {
        return sessionId;
    }

    /**
     * 设置会话ID。
     *
     * @param sessionId 会话ID
     */
    public void setSessionId(String sessionId) {
        this.sessionId = sessionId;
    }

    /**
     * 获取智能体ID。
     *
     * @return 智能体ID
     */
    public String getAgentId() {
        return agentId;
    }

    /**
     * 设置智能体ID。
     *
     * @param agentId 智能体ID
     */
    public void setAgentId(String agentId) {
        this.agentId = agentId;
    }

    /**
     * 获取消息ID。
     *
     * @return 消息ID
     */
    public String getMessageId() {
        return messageId;
    }

    /**
     * 设置消息ID。
     *
     * @param messageId 消息ID
     */
    public void setMessageId(String messageId) {
        this.messageId = messageId;
    }

    /**
     * 获取工具调用ID。
     *
     * @return 工具调用ID
     */
    public String getToolCallId() {
        return toolCallId;
    }

    /**
     * 设置工具调用ID。
     *
     * @param toolCallId 工具调用ID
     */
    public void setToolCallId(String toolCallId) {
        this.toolCallId = toolCallId;
    }

    /**
     * 获取结构化消息。
     *
     * @return 结构化消息
     */
    public AgentMessage getMessage() {
        return message;
    }

    /**
     * 设置结构化消息。
     *
     * @param message 结构化消息
     */
    public void setMessage(AgentMessage message) {
        this.message = message;
    }

    /**
     * 获取载荷。
     *
     * @return 载荷
     */
    public Map<String, Object> getPayload() {
        return payload;
    }

    /**
     * 设置载荷。
     *
     * @param payload 载荷
     */
    public void setPayload(Map<String, Object> payload) {
        this.payload = payload == null ? new LinkedHashMap<>() : payload;
    }

    /**
     * 获取元数据。
     *
     * @return 元数据
     */
    public Map<String, Object> getMetadata() {
        return metadata;
    }

    /**
     * 设置元数据。
     *
     * @param metadata 元数据
     */
    public void setMetadata(Map<String, Object> metadata) {
        this.metadata = metadata == null ? new LinkedHashMap<>() : metadata;
    }

    /**
     * 获取创建时间。
     *
     * @return 创建时间
     */
    public Instant getCreatedAt() {
        return createdAt;
    }

    /**
     * 设置创建时间。
     *
     * @param createdAt 创建时间
     */
    public void setCreatedAt(Instant createdAt) {
        this.createdAt = createdAt == null ? Instant.now() : createdAt;
    }
}
