// bot/src/providers/llm/index.ts — LLMProvider interface and factory

import type { LLMConfig } from '../../types.js'

export interface LLMProvider {
  /**
   * Generates a concise card title (max 80 chars) from a feature description.
   */
  generateTitle(description: string): Promise<string>

  /**
   * Merges previous context with new text, returning a consolidated summary.
   */
  mergeContext(previous: string, newText: string): Promise<string>

  /**
   * Elabora um artefato completo (ex.: ideia rica) a partir de um system prompt
   * (tipicamente o prompt de um subagent SDD) e de uma entrada do usuário.
   * É o que dá ao bot a mesma qualidade do subagent do Claude Code.
   */
  generateArtifact(systemPrompt: string, userInput: string): Promise<string>
}

export async function createLLMProvider(config: LLMConfig): Promise<LLMProvider> {
  switch (config.provider) {
    case 'anthropic': {
      const { AnthropicProvider } = await import('./anthropic.js')
      return new AnthropicProvider(config)
    }
    case 'openai': {
      const { OpenAIProvider } = await import('./openai.js')
      return new OpenAIProvider(config)
    }
    case 'ollama': {
      const { OllamaProvider } = await import('./ollama.js')
      return new OllamaProvider(config)
    }
    default: {
      const _exhaustive: never = config.provider
      throw new Error(`Unknown LLM provider: ${_exhaustive}`)
    }
  }
}
