/**
 * Tool插件系统基础接口
 */

/**
 * 工具接口 - 所有Tool必须实现
 */
export interface ITool<TConfig = any> {
  /**
   * 工具唯一标识
   */
  readonly name: string;
  
  /**
   * 初始化工具
   * @param config 工具配置
   */
  initialize(config: TConfig): Promise<void>;
  
  /**
   * 清理资源（可选）
   */
  cleanup?(): Promise<void>;
  
  /**
   * 健康检查（可选）
   */
  healthCheck?(): Promise<boolean>;
}

/**
 * 工具抽象基类 - 提供标准实现和约束
 */
export abstract class BaseTool<TConfig = any> implements ITool<TConfig> {
  abstract readonly name: string;
  
  protected config!: TConfig;
  protected initialized = false;
  
  /**
   * 模板方法 - 强制初始化流程
   */
  async initialize(config: TConfig): Promise<void> {
    this.validateConfig(config);
    this.config = config;
    await this.doInitialize();
    this.initialized = true;
    console.log(`  ✓ ${this.name} initialized`);
  }
  
  /**
   * 强制子类实现配置验证
   */
  protected abstract validateConfig(config: TConfig): void;
  
  /**
   * 强制子类实现初始化逻辑
   */
  protected abstract doInitialize(): Promise<void>;
  
  /**
   * 确保已初始化
   */
  protected ensureInitialized(): void {
    if (!this.initialized) {
      throw new Error(`${this.name} is not initialized. Call initialize() first.`);
    }
  }
  
  /**
   * 默认清理实现
   */
  async cleanup(): Promise<void> {
    this.initialized = false;
    console.log(`  ✓ ${this.name} cleaned up`);
  }
  
  /**
   * 默认健康检查
   */
  async healthCheck(): Promise<boolean> {
    return this.initialized;
  }
}
