from typing import Literal
from pydantic import BaseModel, Field


class EndpointCapabilities(BaseModel):
    id: str
    kind: str
    direction: Literal["input", "output"]
    sample_rate: int = 16000
    channels: int = 1
    latency_class: Literal["low", "medium", "high"] = "medium"
    supports_aec: bool = False
    supports_barge_in: bool = False
    networked: bool = False
    bluetooth: bool = False
    mobile: bool = False
    default: bool = False


class AudioChunk(BaseModel):
    data: bytes
    sample_rate: int = 16000
    channels: int = 1
    format: str = "wav"
    timestamp_ms: int = 0


class PipelineTrace(BaseModel):
    raw_transcript: str | None = None
    cleaned_transcript: str | None = None
    semantic_response: str | None = None
    spoken_response: str | None = None
    tts_ready_text: str | None = None


class SpeakRequest(BaseModel):
    text: str = Field(min_length=1)
    voice: str | None = None
    language: str | None = None
    output_endpoint: str | None = None
    tts_provider: str | None = None


class ChatRequest(BaseModel):
    text: str = Field(min_length=1)
    input_endpoint: str | None = None
    output_endpoint: str | None = None
    language: str | None = None
    language_mode: Literal["fix", "flex"] | None = None
    voice: str | None = None
    stt_provider: str | None = None
    llm_provider: str | None = None
    tts_provider: str | None = None
    text_only: bool | None = None  # True -> kein Server-Audio (Geräte-TTS spricht selbst)


class SessionRouteRequest(BaseModel):
    input_endpoint: str | None = None
    output_endpoint: str | None = None
    stt_provider: str | None = None
    llm_provider: str | None = None
    tts_provider: str | None = None
    language: str | None = None


class RouteInfo(BaseModel):
    input_endpoint: str
    output_endpoint: str
    stt_provider: str
    llm_provider: str
    tts_provider: str
    language: str


class UserCreate(BaseModel):
    display_name: str = Field(min_length=1)


class UserCreated(BaseModel):
    user_id: str
    display_name: str
    token: str  # nur bei Erstellung sichtbar


class UserUpdate(BaseModel):
    display_name: str = Field(min_length=1)


class UserPrefs(BaseModel):
    input_endpoint: str | None = None
    output_endpoint: str | None = None
    stt_provider: str | None = None
    llm_provider: str | None = None
    tts_provider: str | None = None
    language: str | None = None
    language_mode: Literal["fix", "flex"] | None = None


class MemoryCreate(BaseModel):
    content: str = Field(min_length=1)


class MemoryOut(BaseModel):
    id: int
    content: str
    created_at: str

