<?php
namespace Misuzu\Comments;

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

class CommentsEx {
    public function __construct(
        private AuthInfo $authInfo,
        private Comments $comments,
        private Users $users,
        private array $userInfos = [],
        private array $userColours = []
    ) {}

    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 = $hasUser ? $this->users->getUserColour($info->user) : null;
        $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 {
        if($postInfo->hasUserId()) {
            $userId = $postInfo->getUserId();
            if(array_key_exists($userId, $this->userInfos)) {
                $userInfo = $this->userInfos[$userId];
                $userColour = $this->userColours[$userId];
            } else {
                try {
                    $userInfo = $this->users->getUser($userId, 'id');
                    $userColour = $this->users->getUserColour($userInfo);
                } catch(RuntimeException $ex) {
                    $userInfo = null;
                    $userColour = null;
                }

                $this->userInfos[$userId] = $userInfo;
                $this->userColours[$userId] = $userColour;
            }
        } else {
            $userInfo = null;
            $userColour = null;
        }

        $info = new stdClass;
        $info->post = $postInfo;
        $info->user = $userInfo;
        $info->colour = $userColour;
        $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;
    }
}
