<?php

namespace App\PackagesApi\v4\Controllers\Capsule;

use App\Http\Controllers\Controller;
use App\Packages\User\Models\User;
use App\Packages\v4\Follower\Repository\FollowerRepository;
use App\Packages\v4\User\Repository\UserCapsuleRepository;
use App\Packages\v4\User\Transformer\UserTransformer;
use App\PackagesApi\v4\Requests\Capsule\UsersListRequest;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class UserController extends Controller {

    /** @var User  */
    private $currentUser;

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

    /**
     * Used in capsule create or edit.
     * Return list of users for tag in capsule.
     *
     * @param UsersListRequest $request
     * @return JsonResponse
     */
    public function getListForTag(UsersListRequest $request)
    {
        $limit = false;
        $offset = false;
        $keyword = false;

        if ( $request->has('limit') && $request->filled('limit') )
            $limit = $request->input('limit');

        if ( $request->has('offset') && $request->filled('offset') )
            $offset = $request->input('offset');

        if ( $request->has('keyword') && $request->filled('keyword') )
            $keyword = $request->input('keyword');


        if ( $keyword ) {
            $totalCount = UserCapsuleRepository::init()->countUsersByKeyword(
                $this->currentUser,
                $keyword,
                $offset
            );

            $users = UserCapsuleRepository::init()->getUsersByKeyword(
                $this->currentUser,
                $keyword,
                $limit,
                $offset
            );
        } else {
            $totalCount = FollowerRepository::init()->countListUserFollowing(
                $this->currentUser,
                '',
                $offset
            );

            $following = FollowerRepository::init()->getListUserFollowing(
                $this->currentUser,
                '',
                $limit,
                $offset
            );

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

        $currentCount = $users->count();
        $left = $totalCount - $currentCount;

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

        return jsonSuccess([
            'users' => $users,
            'has_more' => ($left > 0) ? true : false,
        ]);
    }
}