"""
Schemas Pydantic pour l'endpoint /transcribe.

Définit la structure des données échangées entre l'app et le backend
au format JSON, avec validation automatique via Pydantic.
"""

from typing import Optional, Any
from pydantic import BaseModel, Field


class TranscribeMeta(BaseModel):
    """Métadonnées techniques sur la transcription et le parsing."""

    transcription_provider: str = Field(
        default="groq",
        description="Provider utilisé pour la transcription audio",
    )
    transcription_model: str = Field(
        ...,
        description="Modèle Whisper utilisé (ex: whisper-large-v3)",
    )
    parser_provider: Optional[str] = Field(
        default=None,
        description="Provider utilisé pour le parsing LLM (ex: groq)",
    )
    parser_model: Optional[str] = Field(
        default=None,
        description="Modèle LLM utilisé pour le parsing (ex: llama-3.3-70b-versatile)",
    )


class TranscribeResponse(BaseModel):
    """
    Réponse de POST /transcribe.

    Contient :
    - transcript : texte brut transcrit par Whisper
    - detected_language : langue détectée
    - duration_seconds : durée totale du pipeline (transcription + parsing)
    - fields : JSON structuré extrait par le LLM selon le step
    - meta : métadonnées techniques (providers, modèles)
    """

    transcript: str = Field(
        ...,
        description="Texte transcrit par Whisper",
        examples=["J'ai fait mon ingénieur à l'ENSA Tanger en 2023"],
    )
    detected_language: Optional[str] = Field(
        default=None,
        description="Langue détectée par Whisper",
        examples=["French", "Arabic"],
    )
    duration_seconds: float = Field(
        ...,
        description="Temps total du pipeline (transcription + parsing) en secondes",
        examples=[2.95],
    )
    fields: dict[str, Any] = Field(
        default_factory=dict,
        description=(
            "Champs structurés extraits par le LLM. La structure dépend du step : "
            "step 1 = {objective}, step 2 = {formations[]}, "
            "step 3 = {experiences[]}, step 4 = {skills[]}."
        ),
        examples=[
            # Exemple Step 1 — Profil & Objectif
            {"objective": "Chef de chantier avec 10 ans d'expérience..."},
            # Exemple Step 2 — Formations
            {
                "formations": [
                    {
                        "degree": "CAP Maçonnerie",
                        "institution": "CFA Bâtiment",
                        "year_start": "2010",
                        "year_end": "2010",
                    }
                ]
            },
            # Exemple Step 3 — Expériences
            {
                "experiences": [
                    {
                        "position": "Chef d'équipe Maçonnerie",
                        "company": "BatiPro",
                        "description": "Gestion d'une équipe de 5 ouvriers",
                        "year_start": "2018",
                        "year_end": "actuel",
                    }
                ]
            },
            # Exemple Step 4 — Compétences
            {"skills": ["Lecture de plans", "Coffrage", "Gestion d'équipe"]},
        ],
    )
    meta: TranscribeMeta = Field(
        ...,
        description="Métadonnées techniques",
    )


class TranscribeErrorResponse(BaseModel):
    """Réponse d'erreur standardisée."""

    error: str = Field(..., description="Message d'erreur en français")
    detail: Optional[str] = Field(default=None, description="Détails techniques")