package com.easyagents.agent.runtime.tool;

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

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

/**
 * 动态工具声明。
 */
public class AgentToolSpec {

    private String name;
    private String description;
    private AgentToolCategory category = AgentToolCategory.CUSTOM;
    private Map<String, Object> parametersSchema = new LinkedHashMap<>();
    private Map<String, Object> outputSchema = new LinkedHashMap<>();
    private AgentToolVisibility visibility = AgentToolVisibility.VISIBLE;
    private boolean approvalRequired;
    private AgentToolApprovalRequest approvalRequest = new AgentToolApprovalRequest();
    private AgentToolApprovalPolicy approvalPolicy;
    private Map<String, Object> metadata = new LinkedHashMap<>();

    /**
     * 获取工具名称。
     *
     * @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;
    }

    /**
     * 获取分类。
     *
     * @return 分类
     */
    public AgentToolCategory getCategory() {
        return category;
    }

    /**
     * 设置分类。
     *
     * @param category 分类
     */
    public void setCategory(AgentToolCategory category) {
        this.category = category == null ? AgentToolCategory.CUSTOM : category;
    }

    /**
     * 获取参数 JSON Schema。
     *
     * @return 参数 Schema
     */
    public Map<String, Object> getParametersSchema() {
        return parametersSchema;
    }

    /**
     * 设置参数 JSON Schema。
     *
     * @param parametersSchema 参数 Schema
     */
    public void setParametersSchema(Map<String, Object> parametersSchema) {
        this.parametersSchema = parametersSchema == null ? new LinkedHashMap<>() : parametersSchema;
    }

    /**
     * 获取输出 Schema。
     *
     * @return 输出 Schema
     */
    public Map<String, Object> getOutputSchema() {
        return outputSchema;
    }

    /**
     * 设置输出 Schema。
     *
     * @param outputSchema 输出 Schema
     */
    public void setOutputSchema(Map<String, Object> outputSchema) {
        this.outputSchema = outputSchema == null ? new LinkedHashMap<>() : outputSchema;
    }

    /**
     * 获取可见性策略。
     *
     * @return 可见性策略
     */
    public AgentToolVisibility getVisibility() {
        return visibility;
    }

    /**
     * 设置可见性策略。
     *
     * @param visibility 可见性策略
     */
    public void setVisibility(AgentToolVisibility visibility) {
        this.visibility = visibility == null ? AgentToolVisibility.VISIBLE : visibility;
    }

    /**
     * 返回工具执行前是否需要人工审批。
     *
     * @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 动态审批策略；未配置时返回 null
     */
    public AgentToolApprovalPolicy getApprovalPolicy() {
        return approvalPolicy;
    }

    /**
     * 设置单次调用动态审批策略。
     *
     * @param approvalPolicy 动态审批策略
     */
    public void setApprovalPolicy(AgentToolApprovalPolicy approvalPolicy) {
        this.approvalPolicy = approvalPolicy;
    }

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

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