"""
Transcription audio via l'API Whisper (OpenAI).

L'agent cherche automatiquement un fichier .m4a dans le dossier du projet.
Si un fichier est trouvé, il est transcrit puis supprimé.
Sinon, l'entrée texte clavier prend le relais.
"""

from __future__ import annotations

import logging
import os

import openai

import config

logger = logging.getLogger("audio")

WHISPER_MODEL   = "whisper-1"
WHISPER_LANG    = "fr"          # None = auto-détection

# Dossier surveillé : racine du projet (là où se trouve ce fichier)
DOSSIER_ECOUTE = os.path.dirname(os.path.abspath(__file__))


def trouver_enregistrement() -> str | None:
    """
    Cherche un fichier .m4a dans le dossier du projet.
    Si plusieurs fichiers existent, retourne le plus ancien (ordre de création).
    Retourne None si aucun fichier n'est trouvé.
    """
    candidats = [
        os.path.join(DOSSIER_ECOUTE, nom)
        for nom in os.listdir(DOSSIER_ECOUTE)
        if nom.lower().endswith(".m4a")
        and os.path.isfile(os.path.join(DOSSIER_ECOUTE, nom))
    ]
    if not candidats:
        return None
    # Plus ancien en premier (traitement dans l'ordre de dépôt)
    return min(candidats, key=os.path.getmtime)


def transcrire_fichier(chemin: str) -> str:
    """
    Transcrit un fichier audio via Whisper, puis le supprime.

    Args:
        chemin: Chemin absolu vers le fichier .m4a.

    Returns:
        Texte transcrit (str).

    Raises:
        FileNotFoundError: Si le fichier n'existe pas.
        RuntimeError: En cas d'erreur API.
    """
    if not os.path.isfile(chemin):
        raise FileNotFoundError(f"Fichier audio introuvable : {chemin}")

    if not config.OPENAI_API_KEY:
        raise ValueError("Clé API manquante. Définissez OPENAI_API_KEY dans le fichier .env.")

    client = openai.OpenAI(api_key=config.OPENAI_API_KEY)
    nom    = os.path.basename(chemin)

    logger.info(f"Transcription Whisper : {chemin}")
    print(f"Enregistrement détecté : '{nom}' — transcription...", end=" ", flush=True)

    try:
        with open(chemin, "rb") as f:
            reponse = client.audio.transcriptions.create(
                model=WHISPER_MODEL,
                file=f,
                language=WHISPER_LANG,
            )
        texte = reponse.text.strip()
        print(f'"{texte}"')
        logger.info(f"Transcription : {texte!r}")
        return texte

    except openai.AuthenticationError:
        raise RuntimeError("Clé API invalide ou expirée.")
    except openai.APITimeoutError:
        raise RuntimeError("Délai d'attente dépassé lors de la transcription Whisper.")
    except openai.APIStatusError as e:
        raise RuntimeError(f"Erreur Whisper ({e.status_code}) : {e.message}")

    finally:
        # Suppression systématique, même en cas d'erreur API partielle
        if os.path.exists(chemin):
            os.remove(chemin)
            logger.info(f"Fichier supprimé : {nom}")
