from __future__ import annotations

from app.config import Settings, get_settings


MAX_AUDIO_BYTES = 20 * 1024 * 1024


class AudioTranscriptionError(RuntimeError):
    pass


def transcribe_audio_bytes(
    *,
    audio_bytes: bytes,
    file_name: str,
    content_type: str | None,
    language: str | None = "es",
    settings: Settings | None = None,
) -> str:
    settings = settings or get_settings()

    if not settings.mistral_api_key:
        raise AudioTranscriptionError("Configure MISTRAL_API_KEY para transcribir audio.")

    if not audio_bytes:
        raise AudioTranscriptionError("No se recibio audio para transcribir.")

    if len(audio_bytes) > MAX_AUDIO_BYTES:
        raise AudioTranscriptionError("El audio supera el limite de 20 MB.")

    try:
        from mistralai import Mistral
    except ImportError:
        try:
            from mistralai.client import Mistral
        except ImportError as exc:
            raise AudioTranscriptionError("Instale el paquete mistralai para usar transcripcion.") from exc

    client = Mistral(api_key=settings.mistral_api_key)
    response = client.audio.transcriptions.complete(
        model=settings.mistral_transcription_model,
        file={
            "content": audio_bytes,
            "file_name": file_name or "dictado.webm",
            "content_type": content_type or "audio/webm",
        },
        language=_normalize_language(language),
        temperature=0,
    )

    text = getattr(response, "text", "") or ""
    normalized = " ".join(text.split())
    if not normalized:
        raise AudioTranscriptionError("Mistral no devolvio texto transcrito.")

    return normalized


def _normalize_language(language: str | None) -> str:
    if not language:
        return "es"
    return language.split("-")[0].lower() or "es"
