<?php

namespace App\PackagesApi\v4\Controllers\Feed;

use App\Http\Controllers\Controller;
use App\Packages\Capsule\Models\CapsuleRemoved;
use App\Packages\User\Models\User;
use App\Packages\v4\Capsule\Repository\CapsuleRemovedRepository;
use App\Packages\v4\Capsule\Repository\CapsuleRepository;
use App\Packages\v4\Capsule\Repository\CapsuleTaggedUserRepository;
use App\Packages\v4\Capsule\Services\CapsuleFeedService;
use App\Packages\v4\Capsule\Transformer\CapsuleArrayTransformer;
use App\PackagesApi\v4\Requests\Capsule\CancelRequest;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

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

    /** @var CapsuleFeedService */
    private $feedService;

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

    /**
     * Return timeline only with locked capsules
     *
     * @param Request $request
     * @return JsonResponse
     */
    public function timelineLocked(Request $request)
    {
        /** Save user access */
        $this->user->saveAccess('Get only hatched and locked capsules feed');

        $fromDate = $request->get('from_date', null);
        $limit = $request->get('limit', CapsuleFeedService::LIMIT);

        $lockedCapsules = $this->feedService->getLockedCapsules($this->user, $fromDate, $limit);

        $lockedCapsules = $lockedCapsules->map(
            function ($capsule) {
                return CapsuleArrayTransformer::feedCapsuleArray($capsule, $this->user);
            }
        );

        $currentCount = $lockedCapsules->count();
        $totalCount = $this->feedService->getLockedCapsulesCount($this->user, $fromDate);
        $leftCount = $totalCount - $currentCount;

        return jsonSuccess(
            [
                'count' => $currentCount,
                'has_more' => ($leftCount > 0) ? true : false,
                'capsules' => $lockedCapsules,
            ]
        );
    }

    /**
     * Return timeline only with unlocked capsules
     *
     * @param Request $request
     * @return JsonResponse
     */
    public function timelineUnlocked(Request $request)
    {
        /** Save user access */
        $this->user->saveAccess('Get only opened capsules feed');

        $fromDate = $request->get('from_date', null);
        $limit = $request->get('limit', CapsuleFeedService::LIMIT);

        $unlockedCapsules = $this->feedService->getUnlockedCapsules($this->user, $fromDate, $limit);

        $unlockedCapsules = $unlockedCapsules->map(
            function ($capsule) {
                return CapsuleArrayTransformer::feedCapsuleArray($capsule, $this->user);
            }
        );

        $currentCount = $unlockedCapsules->count();
        $totalCount = $this->feedService->getUnlockedCapsulesCount($this->user, $fromDate);
        $leftCount = $totalCount - $currentCount;

        return jsonSuccess(
            [
                'count' => $currentCount,
                'has_more' => ($leftCount > 0) ? true : false,
                'capsules' => $unlockedCapsules,
            ]
        );
    }

    /**
     * @param CancelRequest $request
     *
     * @return JsonResponse
     *
     * @throws \Exception
     */
    public function removeTag(CancelRequest $request)
    {
        $this->user->saveAccess('Remove user tag');

        $capsule = CapsuleRepository::init()->firstByUuid($request->capsule_id);
        if (!$capsule) {
            return jsonErrorEntity([
                'message' => trans('api.msg.capsule_does_not_exists'),
            ]);
        }

        if ($capsule->user_id == $this->user->id) {
            return jsonErrorEntity([
                'message' => 'Can not remove tagged user',
            ]);
        }

        $taggedUser = CapsuleTaggedUserRepository::init()->getTaggedUser($capsule, $this->user);
        $taggedUser->delete();

        return jsonSuccess([
            'capsule' => CapsuleArrayTransformer::mainCapsule($capsule, $this->user),
        ]);
    }

    /**
     * @param CancelRequest $request
     *
     * @return JsonResponse
     *
     * @throws \Exception
     */
    public function remove(CancelRequest $request)
    {
        $this->user->saveAccess('Remove capsule from our feed');

        $capsule = CapsuleRepository::init()->firstByUuid($request->capsule_id);
        if (!$capsule) {
            return jsonErrorEntity([
                'message' => trans('api.msg.capsule_does_not_exists'),
            ]);
        }

        /** @var CapsuleRemoved $relation */
        $relation = CapsuleRemovedRepository::init()->capsuleRelation($capsule, $this->user);
        if (!$relation) {
            /** Remove from timeline */
            CapsuleRemoved::createRelation($capsule, $this->user);
        } else {
            $relation->delete();
        }

        return jsonSuccess([
            'capsule' => CapsuleArrayTransformer::mainCapsule($capsule, $this->user),
        ]);
    }
}
