<?php

namespace App\PackagesApi\v3\Controllers\Feed;

use App\Http\Controllers\Controller;
use App\Packages\Capsule\Services\CapsuleProfileService;
use App\Packages\Capsule\Transformer\CapsuleArrayTransformer;
use App\Packages\User\Models\User;
use App\Packages\User\Repository\UserRepository;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

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

    /** @var CapsuleProfileService */
    private $profileService;

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

    /**
     * Get locked, unlocked capsules
     *
     * @param Request $request
     *
     * @return JsonResponse
     */
    public function profile(Request $request)
    {
        $this->user->saveAccess('View user profile feed');

        $locked = (int)$request->get('locked', null);
        $fromDate = $request->get('from_date', null);
        $userId = $request->get('user', null);

        if ($userId) {
            $user = UserRepository::init()->firstByUuid($userId);
        } else {
            $user = $this->user;
        }

        if ($locked) {
            $capsules = $this->profileService->getUserLockedCapsules($user, $fromDate);
            $count = $this->profileService->getUserLockedCapsulesCount($user, $fromDate);
        } else {
            $capsules = $this->profileService->getUserOpenedCapsules($user, $fromDate);
            $count = $this->profileService->getUserOpenedCapsulesCount($user, $fromDate);
        }

        $loggedUser = $this->user;
        $openedByUser = $user;

        $capsules = $capsules->map(function ($capsule) use ($loggedUser, $openedByUser) {
            return CapsuleArrayTransformer::profileCapsuleArray($capsule, $loggedUser);
        });

        return jsonSuccess(
            [
                'locked' => $locked,
                'total_count' => (int)($count - $capsules->count()),
                'capsules' => $capsules,
            ]
        );
    }
}
