"""Factory STT/TTS según Settings (cambio cloud↔local = una variable de entorno)."""

from __future__ import annotations

import logging

from config import Settings, get_settings
from voice.google_credentials import configure_google_credentials
from voice.protocols import SpeechToText, TextToSpeech

logger = logging.getLogger(__name__)


def create_speech_to_text(settings: Settings | None = None) -> SpeechToText:
    cfg = settings or get_settings()
    provider = (cfg.stt_provider or "google").strip().lower()

    if provider == "google":
        configure_google_credentials(cfg)
        from voice.stt.google_stt import GoogleSpeechToText

        logger.info("STT provider=google lang=%s", cfg.google_stt_language)
        return GoogleSpeechToText(
            language_code=cfg.google_stt_language,
            model=cfg.google_stt_model,
        )

    if provider == "local":
        from voice.stt.local_stt import LocalSpeechToText

        logger.info("STT provider=local (placeholder)")
        return LocalSpeechToText()

    raise ValueError(
        f"STT_PROVIDER desconocido: {provider!r}. Usá 'google' o 'local'."
    )


def create_text_to_speech(settings: Settings | None = None) -> TextToSpeech:
    cfg = settings or get_settings()
    provider = (cfg.tts_provider or "google").strip().lower()

    if provider == "google":
        configure_google_credentials(cfg)
        from voice.tts.google_tts import GoogleTextToSpeech

        logger.info(
            "TTS provider=google voice=%s lang=%s",
            cfg.google_tts_voice,
            cfg.google_tts_language,
        )
        return GoogleTextToSpeech(
            language_code=cfg.google_tts_language,
            voice_name=cfg.google_tts_voice,
            speaking_rate=cfg.google_tts_speaking_rate,
        )

    if provider == "elevenlabs":
        from voice.tts.elevenlabs_tts import ElevenLabsTextToSpeech

        logger.info(
            "TTS provider=elevenlabs voice_id=%s model=%s",
            cfg.elevenlabs_voice_id,
            cfg.elevenlabs_model_id,
        )
        return ElevenLabsTextToSpeech(
            api_key=cfg.elevenlabs_api_key,
            voice_id=cfg.elevenlabs_voice_id,
            model_id=cfg.elevenlabs_model_id,
        )

    if provider == "local":
        from voice.tts.local_tts import LocalTextToSpeech

        logger.info("TTS provider=local (placeholder)")
        return LocalTextToSpeech()

    raise ValueError(
        f"TTS_PROVIDER desconocido: {provider!r}. "
        "Usá 'google', 'elevenlabs' o 'local'."
    )
