# retoor <retoor@molodetz.nl>

from __future__ import annotations

from typing import Any, Optional

from devplacepy.schemas.base import _Out
from devplacepy.schemas.battles import WarOut
from devplacepy.schemas.content import (
    AttachmentOut,
    CommentItemOut,
    GistOut,
    MessageOut,
    NewsOut,
    NotificationOut,
    PollOut,
    PostOut,
    ProjectLinkOut,
    ProjectOut,
    ReactionsOut,
    UserOut,
)


class FeedItemOut(_Out):
    post: PostOut
    maturity: Optional[str] = None
    author: Optional[UserOut] = None
    time_ago: Optional[str] = None
    my_vote: int = 0
    comment_count: int = 0
    attachments: list[AttachmentOut] = []
    recent_comments: list[CommentItemOut] = []
    reactions: ReactionsOut = ReactionsOut()
    bookmarked: bool = False
    poll: Optional[PollOut] = None
    war: Optional[WarOut] = None
    project_link: Optional[ProjectLinkOut] = None


class GistItemOut(_Out):
    gist: GistOut
    maturity: Optional[str] = None
    author: Optional[UserOut] = None
    time_ago: Optional[str] = None
    my_vote: int = 0
    comment_count: int = 0
    recent_comments: list[CommentItemOut] = []


class ProjectListItemOut(ProjectOut):
    author_name: Optional[str] = None
    my_vote: int = 0
    recent_comments: list[CommentItemOut] = []


class NewsListItemOut(_Out):
    article: NewsOut
    time_ago: Optional[str] = None
    image_url: Optional[str] = None
    grade: Optional[int] = None
    featured: Optional[int] = None
    recent_comments: list[CommentItemOut] = []


class ConversationOut(_Out):
    other_user: Optional[UserOut] = None
    last_message: Optional[str] = None
    last_message_at: Optional[str] = None
    unread: bool = False


class MessageItemOut(_Out):
    message: MessageOut
    sender: Optional[UserOut] = None
    is_mine: bool = False
    time_ago: Optional[str] = None
    attachments: list[AttachmentOut] = []
    grouped: bool = False


class NotificationItemOut(_Out):
    notification: NotificationOut
    actor: Optional[UserOut] = None
    time_ago: Optional[str] = None


class NotificationGroupOut(_Out):
    label: Optional[str] = None
    entries: list[NotificationItemOut] = []


class LeaderboardEntryOut(_Out):
    uid: Optional[str] = None
    username: Optional[str] = None
    avatar_seed: Optional[str] = None
    stars: Optional[int] = None
    level: Optional[int] = None
    rank: Optional[int] = None


class SavedItemOut(_Out):
    target_type: Optional[str] = None
    target_uid: Optional[str] = None
    type_label: Optional[str] = None
    title: Optional[str] = None
    url: Optional[str] = None
    time_ago: Optional[str] = None


class TopicOut(_Out):
    posts: list[FeedItemOut] = []
    topic: str = ""
    topic_label: str = ""
    next_cursor: Optional[str] = None


class TopicSummaryOut(_Out):
    key: str = ""
    label: str = ""
    post_count: int = 0


class TopicsHubOut(_Out):
    topics: list[TopicSummaryOut] = []


class FeedOut(_Out):
    posts: list[FeedItemOut] = []
    current_tab: Optional[str] = None
    current_topic: Optional[str] = None
    search: Optional[str] = None
    next_cursor: Optional[str] = None
    total_members: Optional[int] = None
    posts_today: Optional[int] = None
    total_projects: Optional[int] = None
    total_gists: Optional[int] = None
    top_authors: list[UserOut] = []
    daily_topic: Optional[Any] = None
    online_users: list[UserOut] = []


class PostDetailOut(_Out):
    maturity: Optional[str] = None
    post: PostOut
    author: Optional[UserOut] = None
    is_owner: bool = False
    star_count: int = 0
    my_vote: int = 0
    time_ago: Optional[str] = None
    comments: list[CommentItemOut] = []
    attachments: list[AttachmentOut] = []
    reactions: ReactionsOut = ReactionsOut()
    bookmarked: bool = False
    poll: Optional[PollOut] = None
    war: Optional[WarOut] = None
    comment_count: Optional[int] = None
    related_posts: list[FeedItemOut] = []
    topics: list[str] = []
    project_link: Optional[ProjectLinkOut] = None


class ProjectsOut(_Out):
    projects: list[ProjectListItemOut] = []
    current_tab: Optional[str] = None
    search: Optional[str] = None
    project_type: Optional[str] = None
    total_count: Optional[int] = None
    next_cursor: Optional[str] = None
    total_members: Optional[int] = None
    top_authors: list[UserOut] = []


class ProjectDetailOut(_Out):
    maturity: Optional[str] = None
    project: ProjectOut
    author: Optional[UserOut] = None
    is_owner: bool = False
    star_count: int = 0
    my_vote: int = 0
    time_ago: Optional[str] = None
    comments: list[CommentItemOut] = []
    attachments: list[AttachmentOut] = []
    reactions: ReactionsOut = ReactionsOut()
    bookmarked: bool = False
    platforms: Optional[Any] = None
    is_private: bool = False
    read_only: bool = False
    viewer_can_containers: bool = False
    viewer_can_workspace: bool = False
    workspace_editor_url: Optional[str] = None
    workspace_editor_mode: Optional[str] = None
    workspace_editor_width: Optional[int] = None
    workspace_editor_height: Optional[int] = None
    forked_from: Optional[dict] = None
    fork_count: int = 0
    file_count: int = 0
    comment_count: int = 0
    devlog_posts: list[FeedItemOut] = []
    devlog_next_cursor: Optional[str] = None
    devlog_count: int = 0


class GistsOut(_Out):
    gists: list[GistItemOut] = []
    total_count: Optional[int] = None
    next_cursor: Optional[str] = None
    current_language: Optional[str] = None
    search: Optional[str] = None
    languages: list[tuple[str, str]] = []
    gist_language_codes: list[str] = []


class GistDetailOut(_Out):
    maturity: Optional[str] = None
    gist: GistOut
    author: Optional[UserOut] = None
    is_owner: bool = False
    star_count: int = 0
    my_vote: int = 0
    time_ago: Optional[str] = None
    comments: list[CommentItemOut] = []
    attachments: list[AttachmentOut] = []
    reactions: ReactionsOut = ReactionsOut()
    bookmarked: bool = False


class NewsListOut(_Out):
    articles: list[NewsListItemOut] = []
    next_cursor: Optional[str] = None


class NewsDetailOut(_Out):
    maturity: Optional[str] = None
    article: NewsOut
    canonical_slug: Optional[str] = None
    image_url: Optional[str] = None
    grade: Optional[int] = None
    time_ago: Optional[str] = None
    comments: list[CommentItemOut] = []
    bookmarked: bool = False


class MessagesOut(_Out):
    conversations: list[ConversationOut] = []
    messages: list[MessageItemOut] = []
    other_user: Optional[UserOut] = None
    current_conversation: Optional[str] = None
    search: Optional[str] = None
    other_online: bool = False
    other_last_seen: Optional[str] = None


class NotificationsOut(_Out):
    notification_groups: list[NotificationGroupOut] = []
    next_cursor: Optional[str] = None


class LeaderboardOut(_Out):
    entries: list[LeaderboardEntryOut] = []
    user_rank: Optional[int] = None
    total_members: Optional[int] = None
    posts_today: Optional[int] = None
    total_projects: Optional[int] = None
    total_gists: Optional[int] = None
    top_authors: list[UserOut] = []
    featured_news: list[NewsOut] = []


class SavedOut(_Out):
    items: list[SavedItemOut] = []
    next_cursor: Optional[str] = None

