<?php

use Flarum\Api\Serializer\BasicUserSerializer;
use Flarum\Api\Serializer\UserSerializer;
use Flarum\Discussion\Filter\DiscussionFilterer;
use Flarum\Extend;
use Flarum\User\User;
use Nashmi\FollowingTimeline\Api\Controller\FollowUserController;
use Nashmi\FollowingTimeline\Api\Controller\UnfollowUserController;
use Nashmi\FollowingTimeline\Filter\FollowingFilter;
use Nashmi\FollowingTimeline\UserFollow;

return [
    (new Extend\Frontend('forum'))
        ->js(__DIR__.'/js/dist/forum.js')
        ->css(__DIR__.'/less/forum.less')
        ->route('/following-users', 'nashmi-following-timeline.following'),

    new Extend\Locales(__DIR__.'/locale'),

    (new Extend\Routes('api'))
        ->post('/users/{id}/follow', 'nashmi-following-timeline.users.follow', FollowUserController::class)
        ->delete('/users/{id}/follow', 'nashmi-following-timeline.users.unfollow', UnfollowUserController::class),

    (new Extend\Filter(DiscussionFilterer::class))
        ->addFilter(FollowingFilter::class),

    (new Extend\ApiSerializer(UserSerializer::class))
        ->attribute('isFollowedByCurrentUser', function ($serializer, User $user): bool {
            $actor = $serializer->getActor();

            if ($actor->isGuest() || (int) $actor->id === (int) $user->id) {
                return false;
            }

            return UserFollow::query()
                ->where('follower_id', $actor->id)
                ->where('followed_id', $user->id)
                ->exists();
        })
        ->attribute('followersCount', function ($serializer, User $user): int {
            return UserFollow::query()
                ->where('followed_id', $user->id)
                ->count();
        })
        ->attribute('followingCount', function ($serializer, User $user): int {
            return UserFollow::query()
                ->where('follower_id', $user->id)
                ->count();
        }),

    (new Extend\ApiSerializer(BasicUserSerializer::class))
        ->attribute('isFollowedByCurrentUser', function ($serializer, User $user): bool {
            $actor = $serializer->getActor();

            if ($actor->isGuest() || (int) $actor->id === (int) $user->id) {
                return false;
            }

            return UserFollow::query()
                ->where('follower_id', $actor->id)
                ->where('followed_id', $user->id)
                ->exists();
        })
        ->attribute('followersCount', function ($serializer, User $user): int {
            return UserFollow::query()
                ->where('followed_id', $user->id)
                ->count();
        })
        ->attribute('followingCount', function ($serializer, User $user): int {
            return UserFollow::query()
                ->where('follower_id', $user->id)
                ->count();
        }),
];
