package com.easyagents.agent.runtime;

import com.easyagents.agent.runtime.knowledge.AgentKnowledgeRegistration;
import com.easyagents.agent.runtime.media.AgentMediaResolver;
import com.easyagents.agent.runtime.memory.AgentMemorySnapshot;
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 AgentInitRequest {

    /**
     * 会话ID，用于从会话存储中加载和保存当前智能体的上下文状态。
     */
    private String sessionId;

    /**
     * 智能体定义，包含模型、系统提示词、工具、知识库、记忆策略等静态配置。
     */
    private AgentDefinition agentDefinition;

    /**
     * 会话状态存储实现，可以实现此接口以管理 session
     */
    private AgentSessionStore sessionStore = NoopAgentSessionStore.INSTANCE;

    /**
     * 运行时上下文，传递租户、用户、链路等调用环境信息。
     */
    private AgentRuntimeContext runtimeContext = new AgentRuntimeContext();

    /**
     * 工具集合。
     */
    private Map<String, AgentToolInvoker> toolInvokers = new LinkedHashMap<>();

    /**
     * 知识库集合，实现AgentKnowledgeRetriever接口以进行知识检索动作。
     */
    private List<AgentKnowledgeRegistration> knowledgeRegistrations = new ArrayList<>();

    /**
     * 首次构建 Agent 时装载的对话历史快照。
     */
    private AgentMemorySnapshot memorySnapshot = new AgentMemorySnapshot();

    /**
     * 对话事件记录器，用于记录运行时事件流。
     */
    private AgentConversationRecorder conversationRecorder = NoopAgentConversationRecorder.INSTANCE;

    /**
     * 初始化元数据，用于传递业务侧扩展信息。
     */
    private Map<String, Object> metadata = new LinkedHashMap<>();

    /**
     * 媒体引用解析器，仅在模型调用前解析稳定引用。
     */
    private AgentMediaResolver mediaResolver;

    /**
     * 获取会话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 AgentSessionStore getSessionStore() {
        return sessionStore;
    }

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

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

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

    /**
     * 获取工具调用器。
     *
     * @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);
    }

    /**
     * 获取首次构建 Agent 时的对话历史快照。
     *
     * @return 对话历史快照
     */
    public AgentMemorySnapshot getMemorySnapshot() {
        return memorySnapshot;
    }

    /**
     * 设置首次构建 Agent 时的对话历史快照。
     *
     * @param memorySnapshot 对话历史快照
     */
    public void setMemorySnapshot(AgentMemorySnapshot memorySnapshot) {
        this.memorySnapshot = memorySnapshot == null ? new AgentMemorySnapshot() : memorySnapshot;
    }

    /**
     * 获取会话记录器。
     *
     * @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 AgentMediaResolver getMediaResolver() {
        return mediaResolver;
    }

    /**
     * 设置媒体引用解析器。
     *
     * @param mediaResolver 媒体引用解析器
     */
    public void setMediaResolver(AgentMediaResolver mediaResolver) {
        this.mediaResolver = mediaResolver;
    }
}
