<?php
namespace Misuzu\Comments;

use stdClass;
use RuntimeException;
use Misuzu\MisuzuContext;
use Misuzu\Perm;
use Misuzu\Auth\AuthInfo;
use Misuzu\Users\UsersContext;

class CommentsEx {
    public function __construct(
        private AuthInfo $authInfo,
        private Comments $comments,
        private UsersContext $usersCtx
    ) {}

    public function getCommentsForLayout(CommentsCategoryInfo|string $category): object {
        $info = new stdClass;
        if(is_string($category))
            $category = $this->comments->ensureCategory($category);

        $hasUser = $this->authInfo->isLoggedIn();
        $info->user = $hasUser ? $this->authInfo->getUserInfo() : null;
        $info->colour = $this->usersCtx->getUserColour($info->user);
        $info->perms = $this->authInfo->getPerms('global')->checkMany([
            'can_post' => Perm::G_COMMENTS_CREATE,
            'can_delete' => Perm::G_COMMENTS_DELETE_OWN | Perm::G_COMMENTS_DELETE_ANY,
            'can_delete_any' => Perm::G_COMMENTS_DELETE_ANY,
            'can_pin' => Perm::G_COMMENTS_PIN,
            'can_lock' => Perm::G_COMMENTS_LOCK,
            'can_vote' => Perm::G_COMMENTS_VOTE,
        ]);
        $info->category = $category;
        $info->posts = [];

        $root = $this->comments->getPosts($category, includeRepliesCount: true, includeVotesCount: true, replies: false);
        foreach($root as $postInfo)
            $info->posts[] = $this->decorateComment($postInfo);

        return $info;
    }

    public function decorateComment(CommentsPostInfo $postInfo): object {
        $userInfo = $postInfo->hasUserId() ? $this->usersCtx->getUserInfo($postInfo->getUserId()) : null;

        $info = new stdClass;
        $info->post = $postInfo;
        $info->user = $userInfo;
        $info->colour = $this->usersCtx->getUserColour($userInfo);
        $info->vote = $this->comments->getPostVote($postInfo, $userInfo);
        $info->replies = [];

        $root = $this->comments->getPosts(parentInfo: $postInfo, includeRepliesCount: true, includeVotesCount: true);
        foreach($root as $childInfo)
            $info->replies[] = $this->decorateComment($childInfo);

        return $info;
    }
}
