"""Schemas — Voice transcription."""

from enum import Enum
from typing import Any
from uuid import UUID

from pydantic import BaseModel, Field, model_validator

from app.schemas.common import StubMeta


class TranscriptionProvider(str, Enum):
    WHISPER = "whisper"
    STUB = "stub"


class TranscriptionRequest(BaseModel):
    """POST /api/v1/transcription"""

    correlation_id: UUID | None = None
    interview_id: str
    provider: TranscriptionProvider = TranscriptionProvider.WHISPER
    audio_base64: str | None = None
    source_url: str | None = None
    language: str = Field(default="en", min_length=2, max_length=10)
    diarize: bool = False
    options: dict[str, Any] = Field(default_factory=dict)

    @model_validator(mode="after")
    def require_one_source(self) -> "TranscriptionRequest":
        if bool(self.audio_base64) == bool(self.source_url):
            raise ValueError("Provide exactly one of audio_base64 or source_url")
        return self


class TranscriptSegment(BaseModel):
    start_ms: int
    end_ms: int
    speaker: str | None = None
    text: str
    confidence: float | None = None


class TranscriptionResponse(StubMeta):
    correlation_id: UUID | None = None
    interview_id: str
    provider: TranscriptionProvider
    text: str | None = None
    segments: list[TranscriptSegment] = Field(default_factory=list)
