from dataclasses import dataclass
from typing import Optional, List, Dict, Any
from enum import Enum


class NotificationType(Enum):
    MENTION = "mention"
    REPLY = "reply"
    FOLLOW = "follow"
    FAVOURITE = "favourite"
    REBLOG = "reblog"
    POLL = "poll"
    OTHER = "other"


class Visibility(Enum):
    PUBLIC = "public"
    UNLISTED = "unlisted"
    HOME = "home"
    FOLLOWERS = "followers"
    SPECIFIED = "specified"
    DIRECT = "direct"


@dataclass
class FediverseUser:
    """Common user representation across Fediverse platforms"""
    id: str
    username: str
    host: Optional[str] = None  # None for local users
    display_name: Optional[str] = None
    
    @property
    def full_handle(self) -> str:
        """Returns the full fediverse handle (@user@domain or @user for local)"""
        if self.host:
            return f"@{self.username}@{self.host}"
        return f"@{self.username}"


@dataclass
class FediverseFile:
    """Common file/attachment representation"""
    id: str
    url: str
    type: Optional[str] = None
    name: Optional[str] = None


@dataclass
class FediversePost:
    """Common post representation across Fediverse platforms"""
    id: str
    text: Optional[str]
    user: FediverseUser
    visibility: Visibility
    created_at: Optional[str] = None
    files: List[FediverseFile] = None
    reply_to_id: Optional[str] = None
    
    def __post_init__(self):
        if self.files is None:
            self.files = []


@dataclass
class FediverseNotification:
    """Common notification representation across Fediverse platforms"""
    id: str
    type: NotificationType
    user: FediverseUser
    post: Optional[FediversePost] = None
    created_at: Optional[str] = None