import { ILogger, AIProviderConfig } from '../types';
import { AIProviderFactory } from '../ai/AIProviderFactory';

export class ProviderInitializer {
  constructor(private logger: ILogger) {}

  initializeProvider(providerName?: string): AIProviderConfig {
    const providerType = providerName || process.env.AI_PROVIDER || 'openai';
    let config: AIProviderConfig;

    switch (providerType.toLowerCase()) {
      case 'openai':
        config = {
          type: providerType,
          apiKey: process.env.OPENAI_API_KEY || '',
          model: process.env.OPENAI_API_MODEL || 'gpt-4'
        };
        break;
      case 'anthropic':
        config = {
          type: providerType,
          apiKey: process.env.ANTHROPIC_API_KEY || '',
          model: process.env.ANTHROPIC_MODEL || ''
        };
        break;
      case 'google':
        config = {
          type: providerType,
          apiKey: process.env.GOOGLE_API_KEY || '',
          model: process.env.GOOGLE_GEMINI_MODEL || ''
        };
        break;
      case 'openrouter':
        config = {
          type: providerType,
          apiKey: process.env.OPENROUTER_API_KEY || '',
          model: process.env.OPENROUTER_MODEL || '',
          httpReferer: process.env.OPENROUTER_HTTP_REFERER,
          xTitle: process.env.OPENROUTER_X_TITLE
        };
        break;
      case 'azure':
        config = {
          type: providerType,
          apiKey: process.env.AZURE_OPENAI_API_KEY || '',
          endpoint: process.env.AZURE_OPENAI_ENDPOINT || '',
          deployment: process.env.AZURE_OPENAI_DEPLOYMENT_NAME || '', 
          subscriptionId: process.env.AZURE_SUBSCRIPTION_ID || ''
        };
        break;
      default:
        throw new Error(`Unsupported AI provider: ${providerType}`);
    }

    if (!config.apiKey) {
      throw new Error(`API key not found for provider: ${providerType}`);
    }

    if (providerType !== 'azure' && !config.model) {
      throw new Error(`Model not specified for provider: ${providerType}`);
    }

    this.logger.info(`Initialized provider config for ${providerType}`);
    return config;
  }
}