"""Factory LLM según Settings."""

from __future__ import annotations

import logging

from config import Settings, get_settings
from llm.protocols import LanguageModel

logger = logging.getLogger(__name__)


def create_language_model(settings: Settings | None = None) -> LanguageModel:
    cfg = settings or get_settings()
    provider = (cfg.llm_provider or "openai").strip().lower()
    system_prompt = cfg.resolved_bot_system_prompt
    if system_prompt:
        logger.info(
            "Bot system prompt cargado (%d chars) fuente=%s",
            len(system_prompt),
            "BOT_SYSTEM_PROMPT" if cfg.bot_system_prompt.strip() else cfg.bot_system_prompt_file,
        )
    else:
        logger.warning(
            "Sin BOT_SYSTEM_PROMPT ni archivo %s — se usará el default del LLM",
            cfg.bot_system_prompt_file,
        )

    if provider == "openai":
        from llm.openai_llm import OpenAiLanguageModel

        if cfg.openai_assistant_id.strip():
            logger.warning(
                "OPENAI_ASSISTANT_ID definido pero ignorado "
                "(Assistants deprecada → Responses API)"
            )
        logger.info(
            "LLM provider=openai model=%s base=%s modo=responses",
            cfg.openai_model,
            cfg.openai_base_url,
        )
        return OpenAiLanguageModel(
            api_key=cfg.openai_api_key,
            model=cfg.openai_model,
            temperature=cfg.openai_temperature,
            max_tokens=cfg.openai_max_tokens,
            top_p=cfg.openai_top_p,
            frequency_penalty=cfg.openai_frequency_penalty,
            presence_penalty=cfg.openai_presence_penalty,
            system_prompt=system_prompt,
            base_url=cfg.openai_base_url,
            timeout=cfg.openai_timeout,
            provider_name="openai",
        )

    if provider == "ollama":
        from llm.openai_llm import OpenAiLanguageModel

        # Misma clase: API compatible OpenAI chat.completions (sin Responses)
        logger.info(
            "LLM provider=ollama model=%s base=%s",
            cfg.ollama_model,
            cfg.ollama_base_url,
        )
        return OpenAiLanguageModel(
            api_key=cfg.ollama_api_key or "ollama",
            model=cfg.ollama_model,
            temperature=cfg.openai_temperature,
            max_tokens=cfg.openai_max_tokens,
            top_p=cfg.openai_top_p,
            frequency_penalty=0.0,
            presence_penalty=0.0,
            system_prompt=system_prompt,
            base_url=cfg.ollama_base_url,
            timeout=cfg.ollama_timeout,
            provider_name="ollama",
            use_responses=False,
        )

    raise ValueError(
        f"LLM_PROVIDER desconocido: {provider!r}. Usá 'openai' u 'ollama'."
    )
