package com.easyagents.agent.runtime.tool.asynctool;

import com.easyagents.agent.runtime.hitl.AgentToolApprovalRequest;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 异步工具声明。
 *
 * <p>一个声明会被 runtime 展开为 submit、observe、result、cancel 和 list 五个普通工具。</p>
 */
public class AsyncToolSpec {

    private String name;
    private String description;
    private Map<String, Object> submitParametersSchema = new LinkedHashMap<>();
    private AsyncSubTools subTools;
    private AsyncToolOptions options = AsyncToolOptions.defaults();
    private boolean approvalRequired;
    private AgentToolApprovalRequest approvalRequest = new AgentToolApprovalRequest();
    private Map<String, Object> metadata = new LinkedHashMap<>();

    /**
     * 创建空异步工具声明。
     */
    public AsyncToolSpec() {
    }

    /**
     * 获取异步工具基础名称。
     *
     * @return 工具名称
     */
    public String getName() {
        return name;
    }

    /**
     * 设置异步工具基础名称。
     *
     * @param name 工具名称
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取工具描述。
     *
     * @return 工具描述
     */
    public String getDescription() {
        return description;
    }

    /**
     * 设置工具描述。
     *
     * @param description 工具描述
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * 获取提交子工具参数 Schema。
     *
     * @return 参数 Schema
     */
    public Map<String, Object> getSubmitParametersSchema() {
        return submitParametersSchema;
    }

    /**
     * 设置提交子工具参数 Schema。
     *
     * @param submitParametersSchema 参数 Schema
     */
    public void setSubmitParametersSchema(Map<String, Object> submitParametersSchema) {
        this.submitParametersSchema = submitParametersSchema == null ? new LinkedHashMap<>() : submitParametersSchema;
    }

    /**
     * 获取业务子工具实现。
     *
     * @return 子工具实现
     */
    public AsyncSubTools getSubTools() {
        return subTools;
    }

    /**
     * 设置业务子工具实现。
     *
     * @param subTools 子工具实现
     */
    public void setSubTools(AsyncSubTools subTools) {
        this.subTools = subTools;
    }

    /**
     * 获取异步工具选项。
     *
     * @return 工具选项
     */
    public AsyncToolOptions getOptions() {
        return options;
    }

    /**
     * 设置异步工具选项。
     *
     * @param options 工具选项
     */
    public void setOptions(AsyncToolOptions options) {
        this.options = options == null ? AsyncToolOptions.defaults() : options;
    }

    /**
     * 返回提交子工具是否需要人工审批。
     *
     * @return 需要审批时为 true
     */
    public boolean isApprovalRequired() {
        return approvalRequired;
    }

    /**
     * 设置提交子工具是否需要人工审批。
     *
     * @param approvalRequired 审批标记
     */
    public void setApprovalRequired(boolean approvalRequired) {
        this.approvalRequired = approvalRequired;
    }

    /**
     * 获取提交子工具的审批请求配置。
     *
     * @return 审批请求配置
     */
    public AgentToolApprovalRequest getApprovalRequest() {
        return approvalRequest;
    }

    /**
     * 设置提交子工具的审批请求配置。
     *
     * @param approvalRequest 审批请求配置
     */
    public void setApprovalRequest(AgentToolApprovalRequest approvalRequest) {
        this.approvalRequest = approvalRequest == null ? new AgentToolApprovalRequest() : approvalRequest;
    }

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

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