# Kemoverse - a gacha-style bot for the Fediverse.
# Copyright © 2025 Moon and contributors.

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see https://www.gnu.org/licenses/.

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