from datetime import datetime
from typing import Any, List
from pydantic import BaseModel
import pytz

utc=pytz.UTC

class Reaction(BaseModel):
    reaction: str
    actor: str

class AudioFile(BaseModel):
    uri: str
    creation_timestamp: int

class Video(BaseModel):
    uri: str
    creation_timestamp: int

class Photo(BaseModel):
    uri: str
    creation_timestamp: int

class Gif(BaseModel):
    uri: str

class Share(BaseModel):
    link: str
    share_text: str

class Sticker(BaseModel):
    uri: str
    ai_stickers: List[Any]

class Message(BaseModel):
    sender_name: str
    timestamp_ms: int
    content: str | None = None
    sticker: Sticker | None = None
    share: Share | None = None
    photos: List[Photo] | None = None
    videos: List[Video] | None = None
    gifs: List[Gif] | None = None
    audio_files: List[AudioFile] | None = None
    call_duration: int | None = None
    reactions: List[Reaction] | None = None
    is_unsent: bool | None = None
    is_geoblocked_for_viewer: bool

    @property
    def date(self) -> datetime:
        return utc.localize(datetime.fromtimestamp(self.timestamp_ms / 1000))

    def __str__(self) -> str:
        dt = datetime.fromtimestamp(self.timestamp_ms / 1000)
        dt_str = dt.strftime("%d/%m/%Y, %H:%M:%S")
        return f"{self.sender_name}({dt_str}) : {self.content}"

    def __hash__(self) -> int:
        return hash(self.sender_name + str(self.timestamp_ms))