/**
 * SubAgent 配置管理
 * 负责读取、解析和缓存 .agent/agents/ 目录下的 md 文件
 * 类似 SkillManager 的工作方式
 */

const fs = require('fs');
const path = require('path');

/**
 * 解析 YAML frontmatter
 */
function parseFrontmatter(content) {
  const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
  if (!match) return null;

  const frontmatter = {};
  const lines = match[1].split('\n');
  let currentKey = null;

  for (const line of lines) {
    // 处理 metadata 嵌套
    if (currentKey === 'metadata') {
      if (line.match(/^ {2}[a-zA-Z]/)) {
        const colonIndex = line.indexOf(':');
        if (colonIndex > 0) {
          const key = line.substring(2, colonIndex).trim();
          const value = line
            .substring(colonIndex + 1)
            .trim()
            .replace(/^["']|["']$/g, '');
          frontmatter[currentKey][key] = value;
          continue;
        }
      } else if (line.match(/^[a-zA-Z]/)) {
        currentKey = null;
        continue;
      }
    }

    const colonIndex = line.indexOf(':');
    if (colonIndex === -1) continue;

    const key = line.substring(0, colonIndex).trim();
    let value = line.substring(colonIndex + 1).trim();

    // 移除引号
    if (
      (value.startsWith('"') && value.endsWith('"')) ||
      (value.startsWith("'") && value.endsWith("'"))
    ) {
      value = value.slice(1, -1);
    }

    if (key === 'metadata') {
      currentKey = 'metadata';
      frontmatter.metadata = {};
    } else if (key === 'allowed-tools') {
      frontmatter[key] = value
        .split(',')
        .map((v) => v.trim())
        .filter(Boolean);
    } else if (key === 'skills') {
      frontmatter[key] = value
        .split(',')
        .map((v) => v.trim())
        .filter(Boolean);
    } else if (key === 'tools') {
      frontmatter[key] = value
        .split(',')
        .map((v) => v.trim())
        .filter(Boolean);
    } else {
      frontmatter[key] = value;
    }
  }

  return frontmatter;
}

/**
 * 移除 frontmatter，只保留正文内容
 */
function stripFrontmatter(content) {
  return content.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n/, '');
}

class SubAgentConfig {
  constructor(name, filePath) {
    this.name = name;
    this.filePath = filePath;
    this._frontmatter = null;
    this._content = null;
    this._loaded = false;
  }

  /**
   * 加载并解析 md 文件
   */
  load() {
    if (this._loaded) return;

    try {
      const content = fs.readFileSync(this.filePath, 'utf-8');
      this._frontmatter = parseFrontmatter(content);
      this._content = stripFrontmatter(content);
      this._loaded = true;
    } catch (e) {
      console.warn(`[SubAgentConfig] Failed to load ${this.filePath}:`, e.message);
      this._frontmatter = {};
      this._content = '';
      this._loaded = true;
    }
  }

  /**
   * 获取 frontmatter 中的值
   */
  get(key, defaultValue = null) {
    this.load();
    return this._frontmatter?.[key] ?? defaultValue;
  }

  /**
   * 获取名称
   */
  getName() {
    return this.get('name', this.name);
  }

  /**
   * 获取描述
   */
  getDescription() {
    return this.get('description', '');
  }

  /**
   * 获取技能列表
   */
  getSkills() {
    return this.get('skills', []);
  }

  /**
   * 获取工具列表
   */
  getTools() {
    return this.get('tools', []);
  }

  /**
   * 获取模型配置
   */
  getModel() {
    return this.get('model', 'inherit');
  }

  /**
   * 获取完整内容（用于构建系统提示词）
   */
  getContent() {
    this.load();
    return this._content || '';
  }

  /**
   * 获取完整的系统提示词（frontmatter + 内容）
   */
  getSystemPrompt() {
    this.load();
    const desc = this.getDescription();
    const content = this._content || '';

    // 构建系统提示词
    let prompt = `# ${this.getName()}`;
    if (desc) {
      prompt += `\n\n${desc}`;
    }
    if (content.trim()) {
      prompt += `\n\n${content.trim()}`;
    }
    return prompt;
  }

  /**
   * 检查是否有效
   */
  isValid() {
    this.load();
    return this._loaded && this._frontmatter !== null;
  }
}

/**
 * SubAgent 配置管理器
 * 管理目录下所有子代理配置的加载和缓存
 */
class SubAgentConfigManager {
  constructor(agentsDir) {
    this.agentsDir = agentsDir;
    this._configs = new Map(); // name -> SubAgentConfig
  }

  /**
   * 加载目录下所有子代理配置
   */
  loadAll() {
    if (!fs.existsSync(this.agentsDir)) {
      return;
    }

    const entries = fs.readdirSync(this.agentsDir, { withFileTypes: true });
    for (const entry of entries) {
      if (entry.isFile() && entry.name.endsWith('.md')) {
        const name = entry.name.replace('.md', '');
        const filePath = path.join(this.agentsDir, entry.name);

        if (!this._configs.has(name)) {
          this._configs.set(name, new SubAgentConfig(name, filePath));
        }
      }
    }
  }

  /**
   * 刷新配置（清除后重新加载）
   */
  refresh() {
    this._configs.clear();
    this.loadAll();
  }

  /**
   * 获取某个子代理配置
   */
  get(name) {
    return this._configs.get(name) || null;
  }

  /**
   * 获取所有配置（Map 格式）
   */
  getAll() {
    return Array.from(this._configs.values());
  }

  /**
   * 获取所有配置（Map 格式，用于兼容性）
   */
  getAllConfigs() {
    return this._configs;
  }

  /**
   * 获取所有有效配置
   */
  getValidConfigs() {
    return this.getAll().filter((c) => c.isValid());
  }

  /**
   * 重新加载
   */
  reload() {
    this._configs.clear();
    this.loadAll();
  }
}

module.exports = { SubAgentConfig, SubAgentConfigManager, parseFrontmatter, stripFrontmatter };
