"""Pydantic request/response schemas for the TTS API."""

from __future__ import annotations

from typing import Literal

from pydantic import BaseModel, Field


# ── Voice management ────────────────────────────────────────────────


class VoiceCloneRequest(BaseModel):
    name: str = Field(..., pattern=r"^[a-zA-Z0-9_-]+$", max_length=64)
    ref_text: str = Field(..., min_length=1)
    language: str = "Auto"


class VoiceDesignRequest(BaseModel):
    name: str = Field(..., pattern=r"^[a-zA-Z0-9_-]+$", max_length=64)
    instruct: str = Field(..., min_length=1)
    sample_text: str = Field(..., min_length=1)
    language: str = "English"


class VoiceInfo(BaseModel):
    name: str
    type: str  # "clone" or "design"
    language: str
    description: str
    created_at: str


# ── TTS generation ──────────────────────────────────────────────────


class GenerateRequest(BaseModel):
    text: str = Field(..., min_length=1)
    voice: str = Field(..., min_length=1)
    language: str = "Auto"
    format: Literal["wav", "mp3"] = "wav"


class CustomVoiceRequest(BaseModel):
    text: str = Field(..., min_length=1)
    speaker: str = "Ryan"
    instruct: str = ""
    language: str = "English"
    format: Literal["wav", "mp3"] = "wav"


# ── Dialog ──────────────────────────────────────────────────────────


class DialogLine(BaseModel):
    character: str
    text: str
    pause_ms: int = Field(default=500, ge=0, le=10000)


class DialogRequest(BaseModel):
    lines: list[DialogLine] = Field(..., min_length=1)
    default_pause_ms: int = Field(default=500, ge=0, le=10000)
    format: Literal["wav", "mp3"] = "wav"


# ── Health ──────────────────────────────────────────────────────────


class HealthResponse(BaseModel):
    status: str = "ok"
    loaded_model: str | None = None
    gpu_memory_allocated_mb: float | None = None
    gpu_memory_reserved_mb: float | None = None
