package tech.easyflow.agent.service;

import com.mybatisflex.core.service.IService;
import tech.easyflow.agent.entity.Agent;
import tech.easyflow.agent.entity.AgentKnowledgeBinding;
import tech.easyflow.agent.entity.AgentSkillBinding;
import tech.easyflow.agent.entity.AgentToolBinding;

import java.math.BigInteger;
import java.util.List;
import java.util.Map;

/**
 * Agent 配置服务。
 */
public interface AgentService extends IService<Agent> {

    /**
     * 获取 Agent 详情。
     *
     * @param id Agent ID
     * @return Agent 详情
     */
    Agent getDetail(BigInteger id);

    /**
     * 保存草稿 Agent。
     *
     * @param agent Agent 草稿
     * @return 保存后的 Agent
     */
    Agent saveDraft(Agent agent);

    /**
     * 更新草稿 Agent。
     *
     * @param agent Agent 草稿
     * @return 更新后的 Agent
     */
    Agent updateDraft(Agent agent);

    /**
     * 在一个事务中保存 Agent 草稿及发生变化的资源绑定。
     *
     * @param agent Agent 草稿
     * @param toolBindings 工具绑定
     * @param replaceToolBindings 是否替换工具绑定
     * @param knowledgeBindings 知识库绑定
     * @param replaceKnowledgeBindings 是否替换知识库绑定
     * @param skillBindings Skill 绑定
     * @param replaceSkillBindings 是否替换 Skill 绑定
     * @return 保存后的 Agent 与本次替换的绑定
     */
    Agent saveDraftGraph(Agent agent,
                         List<AgentToolBinding> toolBindings,
                         boolean replaceToolBindings,
                         List<AgentKnowledgeBinding> knowledgeBindings,
                         boolean replaceKnowledgeBindings,
                         List<AgentSkillBinding> skillBindings,
                         boolean replaceSkillBindings);

    /**
     * 更新 Agent 的可见范围。
     *
     * @param agentId Agent ID
     * @param visibilityScope 可见范围编码
     * @return 更新后的 Agent
     */
    Agent updateVisibilityScope(BigInteger agentId, String visibilityScope);

    /**
     * 获取已发布运行视图。
     *
     * @param id Agent ID
     * @return 已发布运行视图
     */
    Agent getPublishedView(BigInteger id);

    /**
     * 构建发布快照。
     *
     * @param agent Agent 当前草稿
     * @return 发布快照
     */
    Map<String, Object> buildPublishSnapshot(Agent agent);

    /**
     * 从快照还原运行视图。
     *
     * @param snapshot 发布快照
     * @return Agent 运行视图
     */
    Agent fromSnapshot(Map<String, Object> snapshot);
}
