"""Types et structures de données pour le service voice."""

from dataclasses import dataclass
from enum import Enum
from typing import Optional
import time


class PlaybackState(Enum):
    """États de lecture."""

    IDLE = "idle"
    PLAYING = "playing"
    PAUSED = "paused"


class AudioSource(Enum):
    """Sources audio."""

    TTS = "tts"
    MP3 = "mp3"


@dataclass
class TTSRequest:
    """Requête TTS."""

    text: str
    voice: str = "fr"
    spd: float = 1.0
    pitch: float = 1.0


@dataclass
class MP3Request:
    """Requête lecture MP3."""

    file: str
    loop: bool = False


@dataclass
class JawConfig:
    """Configuration jaw sync."""

    gain: float = 1.0
    smoothing: float = 0.3
    latency_ms: int = 120


@dataclass
class VisemeData:
    """Données visème."""

    ts_ms: int
    id: int
    dur_ms: int

    def to_dict(self) -> dict:
        """Conversion en dictionnaire."""
        return {"ts_ms": self.ts_ms, "id": self.id, "dur_ms": self.dur_ms}


@dataclass
class RMSData:
    """Données RMS."""

    ts_ms: int
    rms: float

    def to_dict(self) -> dict:
        """Conversion en dictionnaire."""
        return {"ts_ms": self.ts_ms, "rms": self.rms}


@dataclass
class VoiceState:
    """État du service voice."""

    playing: bool = False
    src: Optional[str] = None
    file: Optional[str] = None

    def to_dict(self) -> dict:
        """Conversion en dictionnaire."""
        return {"playing": self.playing, "src": self.src, "file": self.file}


@dataclass
class Capabilities:
    """Capacités du service."""

    tts: str = "espeak-ng"
    lang: str = "fr"
    mp3: bool = True
    jaw_sync: bool = True

    def to_dict(self) -> dict:
        """Conversion en dictionnaire."""
        return {
            "tts": self.tts,
            "lang": self.lang,
            "mp3": self.mp3,
            "jaw_sync": self.jaw_sync,
        }
