package tech.easyflow.agent.runtime.tool;

import com.easyagents.core.model.chat.tool.Tool;
import org.springframework.stereotype.Service;
import tech.easyflow.ai.entity.Plugin;
import tech.easyflow.ai.entity.PluginItem;

import java.util.Map;

/**
 * Agent Plugin 工具执行器。
 */
@Service
public class PluginToolExecutor {

    /**
     * 构建 Plugin 工具声明来源。
     *
     * @param pluginItem 插件工具
     * @return 工具声明来源
     */
    public Tool buildTool(PluginItem pluginItem) {
        return pluginItem.toFunction();
    }

    /**
     * 使用冻结的父插件配置构建工具声明和执行对象。
     *
     * @param pluginItem 插件工具快照
     * @param plugin 父插件调用配置快照
     * @return 工具声明来源
     */
    public Tool buildTool(PluginItem pluginItem, Plugin plugin) {
        return pluginItem.toFunction(plugin);
    }

    /**
     * 执行 Plugin 工具。
     *
     * @param pluginItem 插件工具
     * @param arguments 执行参数
     * @return 执行结果
     */
    public AgentToolExecutionResult execute(PluginItem pluginItem, Map<String, Object> arguments) {
        Object result = buildTool(pluginItem).invoke(arguments == null ? Map.of() : arguments);
        return new AgentToolExecutionResult(result, null);
    }

    /**
     * 使用冻结父插件配置执行插件工具。
     *
     * @param pluginItem 插件工具快照
     * @param plugin 父插件调用配置快照
     * @param arguments 调用参数
     * @return 执行结果
     */
    public AgentToolExecutionResult execute(PluginItem pluginItem,
                                            Plugin plugin,
                                            Map<String, Object> arguments) {
        Object result = buildTool(pluginItem, plugin).invoke(arguments == null ? Map.of() : arguments);
        return new AgentToolExecutionResult(result, null);
    }
}
