<?php

namespace App\PackagesApi\v4\Controllers\Follower;

use App\Http\Controllers\Controller;
use App\Packages\Follower\Models\FollowerRelation;
use App\Packages\v4\Follower\Repository\FollowerRepository;
use App\Packages\User\Models\User;
use App\Packages\v4\User\Transformer\UserTransformer;
use App\Packages\v4\User\Repository\UserRepository;
use App\PackagesApi\v4\Requests\Follower\FollowerRequest;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\JsonResponse;

/**
 * Class FollowerController
 * @package App\PackagesApi\Controllers\v4\Follower
 */
class FollowerController extends Controller
{
    /** @var User */
    private $auth;

    public function __construct()
    {
        $this->auth = user();
    }

    /**
     * @return JsonResponse
     */
    public function countUserFollowers()
    {
        $count = FollowerRepository::init()->countUserFollowers($this->auth);

        return jsonSuccess([
            'followers_count' => $count
        ]);
    }

    /**
     * @param FollowerRequest $request
     * @return JsonResponse
     */
    public function getUserFollowers(FollowerRequest $request)
    {
        $this->auth->saveAccess('View followers list');
        $this->auth->setLastFollowerSeen();

        $page = (int) $request->input('page', 1);

        if ( $request->input('user_id') ) {
            $user = UserRepository::init()->firstByUuid($request->input('user_id'));
            if (!$user) {
                return jsonErrorEntity([
                    'message' => 'User does not exists',
                ]);
            }
        } else {
            $user = $this->auth;
        }

        $totalCount = FollowerRepository::init()->countPaginatedUserFollowers(
            $user,
            $request->keyword
        );

        $followers = FollowerRepository::init()->getPaginatedUserFollowers(
            $user,
            $request->keyword,
            $page
        );

        $followers = User::query()->hydrate($followers->toArray());

        $followers = $followers->map(function ($follower) {
            return UserTransformer::baseInfoObject($follower);
        });

        return jsonSuccess([
            'total_count' => $totalCount,
            'current_page' => $page,
            'last_page' => max((int) ceil($totalCount /  FollowerRepository::LIMIT_PAGE), 1),
            'followers' => $followers,
        ]);
    }

    /**
     * @return JsonResponse
     */
    public function countUserFollowing()
    {
        $count = FollowerRepository::init()->countUserFollowing($this->auth);

        return jsonSuccess([
            'following_count' => $count
        ]);
    }

    /**
     * @param FollowerRequest $request
     * @return JsonResponse
     */
    public function getUserFollowing(FollowerRequest $request)
    {
        $this->auth->saveAccess('View following list');

        $page = (int) $request->input('page', 1);

        if ( $request->input('user_id') ) {
            $user = UserRepository::init()->firstByUuid($request->input('user_id'));
            if (!$user) {
                return jsonErrorEntity([
                    'message' => 'User does not exists',
                ]);
            }
        } else {
            $user = $this->auth;
        }

        $totalCount = FollowerRepository::init()->countPaginatedUserFollowing(
            $user,
            $request->keyword
        );

        $following = FollowerRepository::init()->getPaginatedUserFollowing(
            $user,
            $request->keyword,
            $page
        );

        $following = User::query()->hydrate($following->toArray());

        $following = $following->map(function ($following) {
            return UserTransformer::baseInfoObject($following);
        });

        return jsonSuccess([
            'total_count' => $totalCount,
            'current_page' => $page,
            'last_page' => max((int) ceil($totalCount /  FollowerRepository::LIMIT_PAGE), 1),
            'following' => $following,
        ]);
    }

    /**
     * @return JsonResponse
     */
    public function waitConfirmationCount()
    {
        $totalCount = FollowerRepository::init()->countPaginatedConfirmationList(
            $this->auth
        );

        return jsonSuccess([
            'wait_confirmation_count' => $totalCount
        ]);
    }

    /**
     * @param FollowerRequest $request
     * @return JsonResponse
     */
    public function waitConfirmationList(FollowerRequest $request)
    {
        $this->auth->saveAccess('View wait confirmation followers');
        $this->auth->setLastConfirmationFollowerSeen();

        $page = (int) $request->input('page', 1);

        $totalCount = FollowerRepository::init()->countPaginatedConfirmationList(
            $this->auth,
            $request->keyword
        );

        $waitConfirmation = FollowerRepository::init()->getPaginatedConfirmationList(
            $this->auth,
            $request->keyword,
            $page
        );

        $waitConfirmation = User::query()->hydrate($waitConfirmation->toArray());

        $waitConfirmation = $waitConfirmation->map(function ($confirmation) {
            return UserTransformer::baseInfoObject($confirmation);
        });

        return jsonSuccess([
            'total_count' => $totalCount,
            'current_page' => $page,
            'last_page' => max((int) ceil($totalCount / FollowerRepository::LIMIT_PAGE), 1),
            'wait_confirmation' => $waitConfirmation
        ]);
    }
}
