// src/index.ts
import { Message, Provider, ModelConfig, AIClientConfig, CompletionOptions } from './types';
import { BaseAIClient } from './clients/base';
import { AnthropicClient } from './clients/anthropic';
import { OpenAIClient } from './clients/openai';

export class AIClient {
  private clients: Map<Provider, BaseAIClient>;
  private defaultProvider: Provider;
  private defaultModel: string;

  constructor(config: AIClientConfig) {
    if (!config.anthropicApiKey && !config.openaiApiKey) {
      throw new Error("At least one provider API key must be provided");
    }
    this.clients = new Map();
    this.defaultProvider = config.defaultProvider || 'openai';
    this.defaultModel = config.defaultModel || '';

    if (config.anthropicApiKey) {
      this.clients.set('anthropic', new AnthropicClient(config.anthropicApiKey));
    }
    if (config.openaiApiKey) {
      this.clients.set('openai', new OpenAIClient(config.openaiApiKey));
    }
  }

  private getClient(provider?: Provider): BaseAIClient {
    const selectedProvider = provider || this.defaultProvider;
    const client = this.clients.get(selectedProvider);
    if (!client) {
      throw new Error(`No client configured for provider: ${selectedProvider}`);
    }
    return client;
  }

  async createCompletion(messages: Message[], options: CompletionOptions = {}): Promise<string> {
    const client = this.getClient(options.provider);
    return client.createCompletion(messages, {
      ...options,
      model: options.model || this.defaultModel,
    });
  }

  async createEmbedding(text: string, provider?: Provider): Promise<number[]> {
    const client = this.getClient(provider);
    return client.createEmbedding(text);
  }
}

export { Message, Provider, ModelConfig, AIClientConfig, CompletionOptions };
