"""Request / response schemas."""
from typing import Optional, List
from pydantic import BaseModel, Field


# ── Auth ──────────────────────────────────────────────────────────────────
class LoginIn(BaseModel):
    username: str
    password: str


# ── Avatar ────────────────────────────────────────────────────────────────
class AvatarCreate(BaseModel):
    name: str = Field(..., min_length=1, max_length=100)
    description: Optional[str] = None
    source_type: str = "photo"       # photo | video
    voice_engine: str = "openai"     # openai | piper | xtts | elevenlabs
    voice_gender: str = "female"     # male | female
    face_engine: str = "liveportrait"
    lip_engine: str = "wav2lip"
    enhance: bool = True
    tags: List[str] = []


class AvatarUpdate(BaseModel):
    name: Optional[str] = None
    description: Optional[str] = None
    status: Optional[str] = None
    voice_engine: Optional[str] = None
    voice_gender: Optional[str] = None
    face_engine: Optional[str] = None
    lip_engine: Optional[str] = None
    enhance: Optional[bool] = None
    tags: Optional[List[str]] = None


# ── Project ───────────────────────────────────────────────────────────────
class ProjectCreate(BaseModel):
    title: str = Field(..., min_length=1, max_length=200)
    avatar_id: str
    script: str = Field(..., min_length=1)
    language: str = "en"
    voice_gender: str = "female"     # male | female (used during generation)
    emotion: str = "natural"         # delivery emotion hint for TTS
    resolution: str = "1080p"
    description: Optional[str] = None
    tags: List[str] = []


class ProjectUpdate(BaseModel):
    title: Optional[str] = None
    script: Optional[str] = None
    status: Optional[str] = None
    language: Optional[str] = None
    voice_gender: Optional[str] = None
    emotion: Optional[str] = None
    description: Optional[str] = None
    resolution: Optional[str] = None
    tags: Optional[List[str]] = None


# ── Video ─────────────────────────────────────────────────────────────────
class VideoUpdate(BaseModel):
    title: Optional[str] = None
    status: Optional[str] = None


# ── Settings ──────────────────────────────────────────────────────────────
class SettingsUpdate(BaseModel):
    ffmpeg_path: Optional[str] = None
    default_voice: Optional[str] = None
    default_voice_gender: Optional[str] = None
    default_language: Optional[str] = None
    default_face_engine: Optional[str] = None
    default_resolution: Optional[str] = None
    openai_key: Optional[str] = None
    elevenlabs_key: Optional[str] = None
    heygen_key: Optional[str] = None
    did_key: Optional[str] = None
    watermark: Optional[bool] = None
    watermark_opacity: Optional[float] = None
    watermark_position: Optional[str] = None


# ── AI language intelligence ────────────────────────────────────────────────
class AIScriptRequest(BaseModel):
    prompt: str = Field(..., min_length=1)
    content_type: str = "general"
    language: str = "en"
    tone: str = "professional"
    length: str = "medium"           # short | medium | long
    emotion: str = "natural"


class AIRewriteRequest(BaseModel):
    script: str = Field(..., min_length=1)
    instruction: Optional[str] = None     # free-form; if None -> "improve"
    language: str = "en"
    tone: str = "professional"


class AITranslateRequest(BaseModel):
    script: str = Field(..., min_length=1)
    target_language: str = Field(..., min_length=2)


class AISummarizeRequest(BaseModel):
    script: str = Field(..., min_length=1)
    language: str = "en"


class AIPersonalizeRequest(BaseModel):
    script: str = Field(..., min_length=1)
    audience: str = Field(..., min_length=1)
    language: str = "en"


class AIDetectRequest(BaseModel):
    text: str = Field(..., min_length=1)


class AIMessage(BaseModel):
    role: str
    content: str


class AIConverseRequest(BaseModel):
    messages: List[AIMessage]
    language: str = "en"
