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

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

import java.util.LinkedHashSet;
import java.util.Set;

/**
 * Agent 操作类工具声明。
 *
 * <p>操作类工具是 runtime 直接适配的 AgentScope 内置工具，用于读文件、写文件和执行 Shell。
 * 这些工具直接作用于后端 JVM 所在宿主环境，调用方必须按 agent、session 或 user 维度传入受控
 * 的绝对工作目录。
 */
public class AgentOperateToolSpec {

    private AgentOperateToolType type;
    private boolean enabled = true;
    private String baseDir;
    private Boolean approvalRequired;
    private AgentToolApprovalRequest approvalRequest;
    private Set<String> shellAllowedCommands = new LinkedHashSet<>();
    private String shellCharset;

    /**
     * 获取操作工具类型。
     *
     * @return 操作工具类型
     */
    public AgentOperateToolType getType() {
        return type;
    }

    /**
     * 设置操作工具类型。
     *
     * @param type 操作工具类型
     */
    public void setType(AgentOperateToolType type) {
        this.type = type;
    }

    /**
     * 返回是否启用该操作工具。
     *
     * @return 启用时为 true
     */
    public boolean isEnabled() {
        return enabled;
    }

    /**
     * 设置是否启用该操作工具。
     *
     * @param enabled 启用标记
     */
    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    /**
     * 获取操作工具工作目录。
     *
     * @return 绝对工作目录
     */
    public String getBaseDir() {
        return baseDir;
    }

    /**
     * 设置操作工具工作目录。
     *
     * @param baseDir 绝对工作目录
     */
    public void setBaseDir(String baseDir) {
        this.baseDir = baseDir;
    }

    /**
     * 获取审批开关覆盖值。
     *
     * @return 审批覆盖值，null 表示使用工具类型默认值
     */
    public Boolean getApprovalRequired() {
        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;
    }

    /**
     * 获取 Shell 命令白名单。
     *
     * @return Shell 命令白名单
     */
    public Set<String> getShellAllowedCommands() {
        return shellAllowedCommands;
    }

    /**
     * 设置 Shell 命令白名单。
     *
     * @param shellAllowedCommands Shell 命令白名单
     */
    public void setShellAllowedCommands(Set<String> shellAllowedCommands) {
        this.shellAllowedCommands = shellAllowedCommands == null ? new LinkedHashSet<>() : new LinkedHashSet<>(shellAllowedCommands);
    }

    /**
     * 获取 Shell 输出字符集名称。
     *
     * @return 字符集名称
     */
    public String getShellCharset() {
        return shellCharset;
    }

    /**
     * 设置 Shell 输出字符集名称。
     *
     * @param shellCharset 字符集名称
     */
    public void setShellCharset(String shellCharset) {
        this.shellCharset = shellCharset;
    }
}
