"""Pydantic modely pro konverzace - eliminuje Title-Dict Bug."""
from __future__ import annotations

from datetime import UTC, datetime
from enum import Enum
from typing import Any

from pydantic import BaseModel, Field, field_validator


class Role(str, Enum):
    user = "user"
    assistant = "assistant"
    system = "system"


class Message(BaseModel):
    role: Role
    content: str


class Conversation(BaseModel):
    id: str
    title: str = "Nova konverzace"
    created_at: datetime
    updated_at: datetime
    history: list[Message] = Field(default_factory=list)

    @field_validator("title", mode="before")
    @classmethod
    def _coerce_title(cls, v: Any) -> str:
        if isinstance(v, dict):
            v = v.get("title", "Nova konverzace")
        if v is None or (isinstance(v, str) and not v.strip()):
            return "Nova konverzace"
        return str(v).strip()

    @field_validator("created_at", "updated_at", mode="before")
    @classmethod
    def _parse_datetime(cls, v: Any) -> datetime:
        if isinstance(v, datetime):
            return v
        if isinstance(v, str) and v:
            return datetime.fromisoformat(v)
        return datetime.now(UTC)

    @classmethod
    def new(cls, title: str = "Nova konverzace") -> Conversation:
        import uuid
        now = datetime.now(UTC)
        return cls(id=str(uuid.uuid4()), title=title, created_at=now, updated_at=now)

    def append(self, role: Role, content: str, keep_last: int = 30) -> None:
        self.history.append(Message(role=role, content=content))
        if len(self.history) > keep_last:
            self.history = self.history[-keep_last:]
        self.updated_at = datetime.now(UTC)

    def to_disk(self) -> dict:
        return self.model_dump(mode="json")

    @classmethod
    def from_disk(cls, data: dict) -> Conversation:
        return cls.model_validate(data)
