import { ILLMAdapter, ModelType } from './types.js';
import { DeepSeekAdapter } from './DeepSeekAdapter.js';
import { QwenAdapter } from './QwenAdapter.js';

/**
 * LLM工厂类
 * 根据模型类型创建相应的适配器实例
 */
export class LLMFactory {
  private static adapters: Map<string, ILLMAdapter> = new Map();

  /**
   * 获取LLM适配器实例（单例模式）
   * @param modelType 模型类型
   * @returns LLM适配器实例
   */
  static getAdapter(modelType: ModelType): ILLMAdapter {
    // 如果已经创建过该适配器，直接返回
    if (this.adapters.has(modelType)) {
      return this.adapters.get(modelType)!;
    }

    // 根据模型类型创建适配器
    let adapter: ILLMAdapter;

    switch (modelType) {
      case 'deepseek-v3':
        adapter = new DeepSeekAdapter('deepseek-chat');
        break;

      case 'qwen3-72b':
        adapter = new QwenAdapter('qwen-plus'); // Qwen3-72B对应的模型名
        break;

      case 'qwen-long':
        adapter = new QwenAdapter('qwen-long'); // 1M上下文超长文本模型
        break;

      case 'gemini-pro':
        // TODO: 实现Gemini适配器
        throw new Error('Gemini adapter is not implemented yet');

      default:
        throw new Error(`Unsupported model type: ${modelType}`);
    }

    // 缓存适配器实例
    this.adapters.set(modelType, adapter);
    return adapter;
  }

  /**
   * 清除适配器缓存
   * @param modelType 可选，指定清除某个模型的适配器，不传则清除所有
   */
  static clearCache(modelType?: ModelType): void {
    if (modelType) {
      this.adapters.delete(modelType);
    } else {
      this.adapters.clear();
    }
  }

  /**
   * 检查模型是否支持
   * @param modelType 模型类型
   * @returns 是否支持
   */
  static isSupported(modelType: string): boolean {
    return ['deepseek-v3', 'qwen3-72b', 'qwen-long', 'gemini-pro'].includes(modelType);
  }

  /**
   * 获取所有支持的模型列表
   * @returns 支持的模型列表
   */
  static getSupportedModels(): ModelType[] {
    return ['deepseek-v3', 'qwen3-72b', 'qwen-long', 'gemini-pro'];
  }
}




