package com.easyagents.agent.runtime;

import com.easyagents.agent.runtime.knowledge.AgentKnowledgeRegistration;
import com.easyagents.agent.runtime.memory.AgentMemorySnapshot;
import com.easyagents.agent.runtime.message.AgentMessage;
import com.easyagents.agent.runtime.persistence.conversation.AgentConversationRecorder;
import com.easyagents.agent.runtime.persistence.conversation.noop.NoopAgentConversationRecorder;
import com.easyagents.agent.runtime.persistence.session.AgentSessionStore;
import com.easyagents.agent.runtime.persistence.session.noop.NoopAgentSessionStore;
import com.easyagents.agent.runtime.tool.AgentToolInvoker;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 单轮智能体运行的内部执行上下文。
 */
public class AgentRuntimeExecutionContext {

    /**
     * 本轮运行请求ID。
     */
    private String requestId;

    /**
     * 本轮运行链路ID。
     */
    private String traceId;

    /**
     * 当前会话ID。
     */
    private String sessionId;

    /**
     * 智能体定义。
     */
    private AgentDefinition agentDefinition;

    /**
     * 业务运行时上下文。
     */
    private AgentRuntimeContext runtimeContext = new AgentRuntimeContext();

    /**
     * 本轮用户消息。
     */
    private AgentMessage userMessage;

    /**
     * 本轮初始记忆快照。
     */
    private AgentMemorySnapshot memorySnapshot = new AgentMemorySnapshot();

    /**
     * 按工具名称索引的工具调用器。
     */
    private Map<String, AgentToolInvoker> toolInvokers = new LinkedHashMap<>();

    /**
     * 按知识库ID索引的检索器。
     */
    private List<AgentKnowledgeRegistration> knowledgeRegistrations = new ArrayList<>();

    /**
     * 会话状态存储。
     */
    private AgentSessionStore sessionStore = NoopAgentSessionStore.INSTANCE;

    /**
     * 对话事件记录器。
     */
    private AgentConversationRecorder conversationRecorder = NoopAgentConversationRecorder.INSTANCE;

    /**
     * 运行元数据。
     */
    private Map<String, Object> metadata = new LinkedHashMap<>();

    /**
     * 运行取消原因。
     */
    private String cancelReason;

    /**
     * 获取请求ID。
     *
     * @return 请求ID
     */
    public String getRequestId() {
        return requestId;
    }

    /**
     * 设置请求ID。
     *
     * @param requestId 请求ID
     */
    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }

    /**
     * 获取链路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;
    }

    /**
     * 获取智能体定义。
     *
     * @return 智能体定义
     */
    public AgentDefinition getAgentDefinition() {
        return agentDefinition;
    }

    /**
     * 设置智能体定义。
     *
     * @param agentDefinition 智能体定义
     */
    public void setAgentDefinition(AgentDefinition agentDefinition) {
        this.agentDefinition = agentDefinition;
    }

    /**
     * 获取运行时上下文。
     *
     * @return 运行时上下文
     */
    public AgentRuntimeContext getRuntimeContext() {
        return runtimeContext;
    }

    /**
     * 设置运行时上下文。
     *
     * @param runtimeContext 运行时上下文
     */
    public void setRuntimeContext(AgentRuntimeContext runtimeContext) {
        this.runtimeContext = runtimeContext == null ? new AgentRuntimeContext() : runtimeContext;
    }

    /**
     * 获取用户消息。
     *
     * @return 用户消息
     */
    public AgentMessage getUserMessage() {
        return userMessage;
    }

    /**
     * 设置用户消息。
     *
     * @param userMessage 用户消息
     */
    public void setUserMessage(AgentMessage userMessage) {
        this.userMessage = userMessage;
    }

    /**
     * 获取记忆快照。
     *
     * @return 记忆快照
     */
    public AgentMemorySnapshot getMemorySnapshot() {
        return memorySnapshot;
    }

    /**
     * 设置记忆快照。
     *
     * @param memorySnapshot 记忆快照
     */
    public void setMemorySnapshot(AgentMemorySnapshot memorySnapshot) {
        this.memorySnapshot = memorySnapshot == null ? new AgentMemorySnapshot() : memorySnapshot;
    }

    /**
     * 获取工具调用器。
     *
     * @return 工具调用器
     */
    public Map<String, AgentToolInvoker> getToolInvokers() {
        return toolInvokers;
    }

    /**
     * 设置工具调用器。
     *
     * @param toolInvokers 工具调用器
     */
    public void setToolInvokers(Map<String, AgentToolInvoker> toolInvokers) {
        this.toolInvokers = toolInvokers == null ? new LinkedHashMap<>() : toolInvokers;
    }

    /**
     * 获取知识库检索器。
     *
     * @return 知识库检索器
     */
    public List<AgentKnowledgeRegistration> getKnowledgeRegistrations() {
        return knowledgeRegistrations;
    }

    /**
     * 设置知识库检索器。
     *
     * @param knowledgeRegistrations 知识库运行时绑定
     */
    public void setKnowledgeRegistrations(List<AgentKnowledgeRegistration> knowledgeRegistrations) {
        this.knowledgeRegistrations = knowledgeRegistrations == null
                ? new ArrayList<>()
                : new ArrayList<>(knowledgeRegistrations);
    }

    /**
     * 获取会话存储。
     *
     * @return 会话存储
     */
    public AgentSessionStore getSessionStore() {
        return sessionStore;
    }

    /**
     * 设置会话存储。
     *
     * @param sessionStore 会话存储
     */
    public void setSessionStore(AgentSessionStore sessionStore) {
        this.sessionStore = sessionStore == null ? NoopAgentSessionStore.INSTANCE : sessionStore;
    }

    /**
     * 获取对话记录器。
     *
     * @return 对话记录器
     */
    public AgentConversationRecorder getConversationRecorder() {
        return conversationRecorder;
    }

    /**
     * 设置对话记录器。
     *
     * @param conversationRecorder 对话记录器
     */
    public void setConversationRecorder(AgentConversationRecorder conversationRecorder) {
        this.conversationRecorder = conversationRecorder == null
                ? NoopAgentConversationRecorder.INSTANCE
                : conversationRecorder;
    }

    /**
     * 获取运行元数据。
     *
     * @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 String getCancelReason() {
        return cancelReason;
    }

    /**
     * 设置取消原因。
     *
     * @param cancelReason 取消原因
     */
    public void setCancelReason(String cancelReason) {
        this.cancelReason = cancelReason;
    }
}
