import type { Tool } from '../types/index.js';
import type { ToolMetadata, ToolWithMetadata, ToolSearchResult } from './types.js';
import { searchTools } from './search.js';

/**
 * 工具注册中心
 * 管理所有工具的注册、查询和搜索
 */
class ToolRegistry {
  private tools: Map<string, ToolWithMetadata> = new Map();

  /**
   * 注册单个工具
   */
  register(tool: ToolWithMetadata): void {
    this.tools.set(tool.name, tool);
  }

  /**
   * 批量注册工具
   */
  registerAll(tools: ToolWithMetadata[]): void {
    for (const tool of tools) {
      this.register(tool);
    }
  }

  /**
   * 获取核心工具 (deferLoading: false)
   * 这些工具在会话开始时就可用
   */
  getCoreTools(): Tool[] {
    const coreTools: Tool[] = [];
    for (const tool of this.tools.values()) {
      if (!tool.metadata.deferLoading) {
        coreTools.push(this.toBasicTool(tool));
      }
    }
    return coreTools;
  }

  /**
   * 获取指定工具
   */
  getTool(name: string): Tool | undefined {
    const tool = this.tools.get(name);
    return tool ? this.toBasicTool(tool) : undefined;
  }

  /**
   * 获取多个工具
   */
  getTools(names: string[]): Tool[] {
    const result: Tool[] = [];
    for (const name of names) {
      const tool = this.getTool(name);
      if (tool) {
        result.push(tool);
      }
    }
    return result;
  }

  /**
   * 搜索工具
   * @param query 搜索查询
   * @param limit 返回结果数量限制
   * @returns 匹配的工具元数据列表
   */
  search(query: string, limit: number = 5): ToolSearchResult[] {
    const allMetadata = this.getAllMetadata();
    return searchTools(query, allMetadata, limit);
  }

  /**
   * 获取所有工具的元数据
   */
  getAllMetadata(): ToolMetadata[] {
    return [...this.tools.values()].map((tool) => tool.metadata);
  }

  /**
   * 获取所有工具 (用于兼容旧代码)
   */
  getAllTools(): Tool[] {
    return [...this.tools.values()].map((tool) => this.toBasicTool(tool));
  }

  /**
   * 检查工具是否存在
   */
  has(name: string): boolean {
    return this.tools.has(name);
  }

  /**
   * 获取工具数量
   */
  get size(): number {
    return this.tools.size;
  }

  /**
   * 将 ToolWithMetadata 转换为基础 Tool 类型
   */
  private toBasicTool(tool: ToolWithMetadata): Tool {
    return {
      name: tool.name,
      description: tool.description,
      parameters: tool.parameters,
      execute: tool.execute,
    };
  }
}

// 导出单例
export const toolRegistry = new ToolRegistry();

// 也导出类，方便测试
export { ToolRegistry };
