<?php

namespace App\PackagesApi\v3\Controllers\Friend;

use App\Http\Controllers\Controller;
use App\Packages\User\Models\User;
use App\Packages\User\Repository\UserRepository;
use App\Packages\User\Services\FriendService;
use App\Packages\User\Transformer\UserTransformer;
use App\PackagesApi\v3\Requests\Friend\RemoveFriendRequest;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

/**
 * Class FriendController
 * @package App\PackagesApi\Controllers\v2\Friend
 */
class FriendController extends Controller
{
    /** @var User */
    private $user;
    /**
     * @var FriendService
     */
    private $friendService;

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

    /**
     * @return JsonResponse
     */
    public function friendsCount()
    {
        $this->user->saveAccess('Get friends count');
        $friendCount = $this->friendService->getFriendsCount($this->user);

        return jsonSuccess([
            'friend_count' => $friendCount,
        ]);
    }

    /**
     * @param Request $request
     *
     * @return JsonResponse
     */
    public function friendsList(Request $request)
    {
        $this->user->saveAccess('View friends list');

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

        $page = $request->get('page');

        $paginator = $this->friendService->getFriendsList($user, $page);
        $friends = collect($paginator->items());
        $list = $friends->map(function ($user) {
            return UserTransformer::objectFriendUserList($user);
        });

        return jsonSuccess([
            'total' => ceil($paginator->total() / $paginator->perPage()),
            'friends' => $list,
        ]);
    }

    /**
     * @TODO: If is my friend
     *
     * @param RemoveFriendRequest $request
     *
     * @return JsonResponse
     *
     * @throws \Exception
     */
    public function removeFriend(RemoveFriendRequest $request)
    {
        $this->user->saveAccess('Removed friend');

        $friend = UserRepository::innit()->firstByUuid($request->user_id);
        if (!$friend) {
            return jsonErrorEntity([
                'message' => 'User does not exists',
            ]);
        }

        // friend exists

        $this->friendService->removeFriend($this->user, $friend);

        return jsonSuccess([
            'message' => 'User removed from friend list',
        ]);
    }
}
