"""
頻道 / 訊息 API schema(階段 3a)。
"""

from datetime import datetime
from typing import Literal
from uuid import UUID

from pydantic import BaseModel, ConfigDict, Field


ChannelType = Literal["public", "private", "direct", "coba_dm"]
MessageType = Literal["text", "image", "file", "audio", "sticker", "system", "coba_action"]


# =============================================================================
# Channel
# =============================================================================
class ChannelCreateRequest(BaseModel):
    name: str = Field(..., min_length=1, max_length=100)
    icon: str = Field(default="💬", max_length=10)
    description: str | None = Field(default=None, max_length=500)
    channel_type: ChannelType = "public"


class ChannelUpdateRequest(BaseModel):
    name: str | None = Field(default=None, min_length=1, max_length=100)
    icon: str | None = Field(default=None, max_length=10)
    description: str | None = Field(default=None, max_length=500)


class ChannelPublic(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: UUID
    name: str
    icon: str
    description: str | None
    channel_type: str
    is_default: bool
    sort_order: int
    created_at: datetime


# =============================================================================
# Message
# =============================================================================
class _UserMini(BaseModel):
    """訊息附帶的發送者簡略資料。庫柏訊息會是 None(由前端判斷)。"""

    model_config = ConfigDict(from_attributes=True)

    id: UUID
    display_name: str
    avatar_url: str | None = None


class _ReactionGroup(BaseModel):
    """同一個 emoji 的所有反應彙整。"""

    emoji: str
    count: int
    user_ids: list[UUID]


class MessageCreateRequest(BaseModel):
    content: str = Field(..., min_length=1, max_length=10000)
    message_type: MessageType = "text"
    reply_to_id: UUID | None = None


class MessageUpdateRequest(BaseModel):
    """編輯訊息(只能改 content)。"""

    content: str = Field(..., min_length=1, max_length=10000)


class MessagePublic(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: UUID
    channel_id: UUID
    user: _UserMini | None   # None = 庫柏 / 系統訊息
    content: str
    message_type: str
    reply_to_id: UUID | None
    is_pinned: bool
    is_edited: bool
    created_at: datetime
    updated_at: datetime
    reactions: list[_ReactionGroup] = []
    # 已讀的使用者(不含訊息作者本人)。LINE 風格的「已讀 N」就靠這個算。
    read_by: list[_UserMini] = []
    # 階段 3e:Coba 自動加的標籤,例如 ["📢 公告", "客戶A"]
    tags: list[str] = []


# =============================================================================
# Reaction
# =============================================================================
class ReactionRequest(BaseModel):
    emoji: str = Field(..., min_length=1, max_length=20)
