import { AIProviderConfig, AnthropicProviderConfig, AzureProviderConfig, VertexProviderConfig, IAIProvider, IAIProviderFactory, OpenAIProviderConfig, OpenRouterProviderConfig } from '../types/provider';
import { ILogger } from '../types/common';

export class AIProviderFactory implements IAIProviderFactory {
  private providerCache: Map<string, IAIProvider> = new Map();

  constructor(private logger: ILogger) {}

  createProvider(config: AIProviderConfig): IAIProvider {
    const cacheKey = `${config.type}-${config.apiKey}`;
    
    if (this.providerCache.has(cacheKey)) {
      return this.providerCache.get(cacheKey)!;
    }

    let provider: IAIProvider;

    switch (config.type) {
      case 'openai':
        const { OpenAIProvider } = require('./providers/OpenAIProvider');
        provider = new OpenAIProvider(config as OpenAIProviderConfig, this.logger);
        break;
      case 'anthropic':
        const { AnthropicProvider } = require('./providers/AnthropicProvider');
        provider = new AnthropicProvider(config as AnthropicProviderConfig, this.logger);
        break;
      case 'azure':
        const { AzureProvider } = require('./providers/AzureProvider');
        provider = new AzureProvider(config as AzureProviderConfig, this.logger);
        break;
      case 'vertex':
        const { VertexProvider } = require('./providers/VertexProvider');
        provider = new VertexProvider(config as VertexProviderConfig, this.logger);
        break;
      case 'openrouter':
        const { OpenRouterProvider } = require('./providers/OpenRouterProvider');
        provider = new OpenRouterProvider(config as OpenRouterProviderConfig, this.logger);
        break;
      default:
        throw new Error(`Unsupported AI provider type: ${config.type}`);
    }

    this.providerCache.set(cacheKey, provider);
    return provider;
  }
}