<?php

namespace App\PackagesApi\v4\Controllers\User;

use App\Http\Controllers\Controller;
use App\Packages\Friend\Models\FriendInvite;
use App\Packages\User\Models\User;
use App\Packages\User\Models\UserNotification;
use App\Packages\User\Models\UserSearch;
use App\Packages\v4\Follower\Repository\FollowerRepository;
use App\Packages\v4\Friend\Repository\FriendInviteRepository;
use App\Packages\v4\User\Repository\UserNotificationRepository;
use App\Packages\v4\User\Repository\UserRepository;
use App\Packages\v4\User\Transformer\UserTransformer;
use App\PackagesApi\v4\Requests\User\UserByNicknameRequest;
use App\PackagesApi\v4\Requests\User\UserRequest;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Http\JsonResponse;

/**
 * Class AuthController
 *
 * @package App\Http\Controllers\API
 */
class UserController extends Controller
{
    /** @var User */
    private $user;

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

    /**
     * @return JsonResponse
     */
    public function updates()
    {
        $userHasNewNotifications = UserNotificationRepository::init()->newNotificationsExists($this->user);
        $userHasNewFollowers = FollowerRepository::init()->newUserFollowersExists($this->user);
        $userHasNewAcceptFollowers = FollowerRepository::init()->newConfirmationFollowersExists($this->user);

        return jsonSuccess(
            [
                'updates' => [
                    'has_new_notifications' => (int)$userHasNewNotifications,
                    'has_new_followers' => (int)$userHasNewFollowers,
                    'has_new_accept_followers' => (int) $userHasNewAcceptFollowers,
                ],
            ]
        );
    }

    /**
     * @return JsonResponse
     * @throws BindingResolutionException
     */
    public function profile()
    {
        $this->user->saveAccess('View our profile');

        return jsonSuccess([
            'user' => UserTransformer::objectUserProfile($this->user, $this->user),
        ]);
    }

    /**
     * @param UserRequest $request
     * @return JsonResponse
     * @throws BindingResolutionException
     */
    public function info(UserRequest $request)
    {
        $this->user->saveAccess('View other profile');

        $userUuid = request()->route('userUuid');
        $user = UserRepository::init()->firstByUuid($userUuid);

        if (!$user) {
            return jsonErrorEntity([
                'message' => 'User does not exists',
            ]);
        }

        if ($request->input('is_searched', false)) {
            $user->refreshSearchPosition();
            UserSearch::setLastSearched($this->user, $user);
        }

        return jsonSuccess([
            'user' => UserTransformer::objectUserProfile($user, $this->user),
        ]);
    }

    /**
     * @return JsonResponse
     * @throws BindingResolutionException
     */
    public function infoByUsername()
    {
        $nickname = request()->route('nickname');
        $user = UserRepository::init()->firstByNickname($nickname);

        if (!$user) {
            return jsonErrorEntity([
                'message' => 'User does not exists',
            ]);
        }

        return jsonSuccess([
            'user' => UserTransformer::objectUserProfile($user, $this->user)
        ]);
    }
}
