from __future__ import annotations

from datetime import datetime

from pydantic import BaseModel, Field


class ZaloAccount(BaseModel):
    id: str = Field(..., description="Mã Zalo account (VD: UUID hoặc Zalo user ID)")
    name: str = Field(..., description="Tên Zalo (VD: Sơn - Giám Đốc)")
    phone_number: str | None = None
    created_at: datetime | None = None
    updated_at: datetime | None = None


class Contact(BaseModel):
    id: str = Field(..., description="Mã Contact (UUID)")
    name: str = Field(..., description="Tên liên hệ")
    phone_number: str | None = None
    is_internal: bool = Field(
        default=False, description="Đánh dấu tài khoản nội bộ công ty (VD: Nhân viên)"
    )
    created_at: datetime | None = None
    updated_at: datetime | None = None


class Conversation(BaseModel):
    id: str = Field(..., description="Mã Conversation (UUID)")
    zalo_account_id: str = Field(
        ..., description="ID của Zalo Account đại diện công ty"
    )
    contact_id: str = Field(..., description="ID của Contact đối tác / nhân viên")
    is_internal: bool = Field(
        default=False,
        description="Đánh dấu conversation này là nội bộ (VD: test, trao đổi nội bộ)",
    )
    created_at: datetime | None = None
    updated_at: datetime | None = None


class Message(BaseModel):
    id: str = Field(..., description="Mã Message (UUID)")
    conversation_id: str = Field(..., description="Mã Conversation chứa tin nhắn này")
    sender_type: str = Field(..., description="'contact' hoặc 'zalo_account'")
    sender_id: str = Field(
        ..., description="Mã của người gửi (tham chiếu Contact hoặc ZaloAccount)"
    )
    content: str = Field(..., description="Nội dung tin nhắn")
    timestamp: datetime = Field(..., description="Thời gian gửi")


class TelegramTopicMap(BaseModel):
    id: str = Field(..., description="Mã Mapping (UUID)")
    conversation_id: str = Field(..., description="Mã Conversation Zalo")
    telegram_topic_id: str = Field(..., description="Topic ID trên Telegram")
    telegram_group_id: str = Field(..., description="Group ID trên Telegram")
    created_at: datetime | None = None
