/**
 * Shared AI Provider Singleton
 * Single source of truth for AI client configuration.
 * Used by ai_response.ts, character_memory.ts, and any other modules needing AI access.
 */

import OpenAI from 'openai';
import { config } from '../../config.js';

export interface AIProvider {
  client: OpenAI;
  model: string;
  name: string;
  /** True only when the active provider actually has an API key configured.
   * Lets callers skip the API entirely (and its slow retry/backoff) and return a
   * canned fallback immediately when no key is set (e.g. local/dev/stub mode). */
  configured: boolean;
}

function createAIProvider(): AIProvider {
  const provider = config.AI_PROVIDER.toLowerCase();

  switch (provider) {
    case 'together':
      return {
        client: new OpenAI({
          apiKey: config.TOGETHER_API_KEY,
          baseURL: 'https://api.together.xyz/v1',
        }),
        model: config.TOGETHER_MODEL,
        name: 'Together AI',
        configured: !!config.TOGETHER_API_KEY,
      };

    case 'mistral':
      return {
        client: new OpenAI({
          apiKey: config.MISTRAL_API_KEY,
          baseURL: 'https://api.mistral.ai/v1',
        }),
        model: config.MISTRAL_MODEL,
        name: 'Mistral AI',
        configured: !!config.MISTRAL_API_KEY,
      };

    case 'openrouter':
      return {
        client: new OpenAI({
          apiKey: config.OPENROUTER_API_KEY,
          baseURL: 'https://openrouter.ai/api/v1',
          defaultHeaders: {
            'HTTP-Referer': 'https://lichun.app',
            'X-Title': 'BaoLife Game',
          },
        }),
        model: config.OPENROUTER_MODEL,
        name: 'OpenRouter',
        configured: !!config.OPENROUTER_API_KEY,
      };

    case 'openai':
    default:
      return {
        client: new OpenAI({
          apiKey: config.OPENAI_API_KEY,
        }),
        model: config.OPENAI_MODEL || config.CONVERSATION_MODEL,
        name: 'OpenAI',
        configured: !!config.OPENAI_API_KEY,
      };
  }
}

export const aiProvider = createAIProvider();
console.log(`AI Provider: ${aiProvider.name} (model: ${aiProvider.model})`);
