from datetime import datetime

from pydantic import BaseModel, Field


class SessionCreate(BaseModel):
    title: str = "新对话"


class SessionOut(BaseModel):
    id: str
    title: str
    created_at: datetime
    updated_at: datetime

    model_config = {"from_attributes": True}


class MessageOut(BaseModel):
    id: str
    session_id: str
    role: str
    content: str
    created_at: datetime

    model_config = {"from_attributes": True}


class ChatRequest(BaseModel):
    message: str


class ChatResponse(BaseModel):
    user_message: MessageOut
    assistant_message: MessageOut


class PresetCreate(BaseModel):
    id: str = Field(..., min_length=1, max_length=64, pattern=r"^[a-zA-Z0-9_-]+$")
    title: str = Field(..., min_length=1, max_length=200)
    prompt_template: str = Field(..., min_length=1)
    category: str = "默认"
    model: str | None = None
    sort_order: int = 0


class PresetUpdate(BaseModel):
    title: str | None = None
    prompt_template: str | None = None
    category: str | None = None
    model: str | None = None
    sort_order: int | None = None


class PresetOut(BaseModel):
    id: str
    title: str
    prompt_template: str
    category: str
    model: str | None
    sort_order: int
    created_at: datetime
    variables: list[str] = []

    model_config = {"from_attributes": True}


class PresetAskRequest(BaseModel):
    session_id: str
    variables: dict[str, str] = {}


class PresetAskResponse(BaseModel):
    preset_id: str
    rendered_prompt: str
    user_message: MessageOut
    assistant_message: MessageOut


class SettingsOut(BaseModel):
    api_key_configured: bool
    deepseek_api_key_masked: str
    deepseek_model: str
    system_prompt: str
    max_history_turns: int
    max_tokens: int
    web_search_enabled: bool
    dashscope_api_key_configured: bool = False
    dashscope_api_key_masked: str = ""
    tts_model: str = "cosyvoice-v3-flash"
    tts_voice: str = "longanyang"


class SettingsUpdate(BaseModel):
    deepseek_api_key: str | None = None
    deepseek_model: str | None = None
    system_prompt: str | None = None
    max_history_turns: int | None = Field(None, ge=1, le=100)
    max_tokens: int | None = Field(None, ge=256, le=8192)
    web_search_enabled: bool | None = None
    dashscope_api_key: str | None = None
    tts_model: str | None = None
    tts_voice: str | None = None


class SettingsTestResponse(BaseModel):
    ok: bool
    message: str
    model: str | None = None
