from uuid import UUID
from datetime import datetime
from pydantic import BaseModel, Field
from typing import Optional, Literal, List, Any, Dict


class MessageForward(BaseModel):
    forward_type: Optional[Literal["chat_private_messages", "chat_group_messages",
                                   "chat_public_messages", "reply"]] = Field(None, description="Тип пересылаемого контента")
    forward_sender_id: Optional[UUID] = Field(None, description="ID чата, откуда переслано сообщение")
    forward_message_id: Optional[int] = Field(None, description="Данные внутренний ид сообщения в forward_chat")
    forward_chat_data: Optional[Any] = Field(default=None, description="Данные о чате пересылаемом (беседы и паблики)")


class MessageItem(BaseModel):
    message_id: int = Field(..., description="внутренний ID сообщения")
    message_type: List[Literal["text", "media", "circle", "voice", "system", "forward",
                               "reply", "poll"]] = Field(..., alias="message_type", description="Типы сообщения")

    forward_metadata: Optional[MessageForward]

    chat_id: UUID = Field(..., description="Чат ID")
    sender_id: UUID = Field(..., description="Кто отправил")
    sender_data: Optional[Any] = Field(default=None, description="Данные о пользователе")
    content: Optional[str] = Field(None, description="Текст сообщения")
    media_link: Optional[Any] = Field(None, description="Ссылка на медиа (заглушка)")
    is_viewed: bool = Field(..., description="Флаг просмотра")
    created_at: datetime = Field(..., description="Дата и время создания сообщения")
    updated_at: Optional[datetime] = Field(None, description="Дата и время обновления сообщения")


class PrivateChatListItem(BaseModel):
    chat_id: UUID = Field(..., description="ID чата")
    chat_type: Literal["self", "private"] = Field(..., description="Тип чата")
    chat_data: Optional[Dict[str, Any]] = Field(default=None, description="Данные о чате")
    last_message: Optional[MessageItem] = Field(None, description="Последнее сообщение в чате")
    created_at: datetime = Field(..., description="Дата создания чата")


class PrivateChatListData(BaseModel):
    items: List[PrivateChatListItem]
    has_more: bool


class PrivateChatListResponse(BaseModel):
    status: str
    data: PrivateChatListData


# history
class PrivateChatHistoryData(BaseModel):
    items: List[MessageItem]
    has_more: bool


class PrivateChatHistoryResponse(BaseModel):
    status: str
    data: PrivateChatHistoryData


# send
class PrivateMessageSendRequest(BaseModel):
    chat_id: UUID
    content: Optional[str] = Field(None, description="Содержимое сообщения (макс. 4096 символов)", max_length=4096)
    message_type: List[Literal["text"]] = Field(
        ..., description="Один или несколько типов сообщения"
    )


class PrivateMessageSendData(BaseModel):
    message_id: int
    chat_id: UUID
    created_at: datetime


class PrivateMessageSendResponse(BaseModel):
    status: str
    data: PrivateMessageSendData