package com.agent.management.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * Hermes Bridge 配置项
 */
@Data
@Component
@ConfigurationProperties(prefix = "hermes")
public class HermesProperties {

    /**
     * 是否启用 Hermes Agent 执行引擎
     * 启用后 Agent 节点将调用 Hermes Bridge 而非直接调用 LLM
     */
    private boolean enabled = false;

    private Bridge bridge = new Bridge();

    @Data
    public static class Bridge {
        /** Bridge 服务监听端口 */
        private int port = 18731;

        /** Python 可执行文件路径 */
        private String pythonPath = "python";

        /** hermes_bridge.py 脚本路径（相对于项目根目录） */
        private String scriptPath = "hermes-bridge/hermes_bridge.py";

        /** 子进程启动超时（秒） */
        private int startupTimeout = 30;

        /** 健康检查间隔（秒），0 表示不检查 */
        private int healthCheckInterval = 60;

        /**
         * Hermes Agent / 智能操作节点默认最大工具调用轮次
         * 节点未显式配置 maxIterations 时使用此值
         */
        private int defaultMaxIterations = 100;

        /**
         * Bridge 子进程使用的 LLM API Key（与前端 LLM 节点隔离）。
         * 为空时回退到 spring.ai.openai.api-key（保持向后兼容）。
         * 推荐为 Bridge 配置独立的 API Key，便于审计和泄露隔离。
         */
        private String llmApiKey = "";

        /**
         * Bridge HTTP 端点访问令牌（X-Bridge-Token 头校验）。
         * 留空时 Bridge 不校验（仅依赖 127.0.0.1 绑定，不安全）。
         * 推荐通过 HERMES_BRIDGE_AUTH_TOKEN 环境变量设置 32+ 字符随机字符串。
         */
        private String authToken = "";

        /**
         * 固定 HERMES_HOME 目录（其下 skills 子目录由 Java 侧 SkillFileSyncer 镜像同步）。
         * 相对路径基于后端工作目录（user.dir）解析。
         * Bridge 子进程启动时通过 --hermes-home 传入，进程生命周期内不变，
         * 避免 hermes-agent 的 SKILLS_DIR 模块级常量冻结在 per-run 目录上。
         */
        private String home = "./data/hermes-home";

        /**
         * 解析 {@link #home} 为绝对路径（相对路径基于 user.dir）。
         */
        public java.nio.file.Path getResolvedHome() {
            java.nio.file.Path p = java.nio.file.Paths.get(home);
            if (!p.isAbsolute()) {
                p = java.nio.file.Paths.get(System.getProperty("user.dir")).resolve(p);
            }
            return p.toAbsolutePath().normalize();
        }
    }
}
