<?php

namespace App\PackagesApi\v3\Controllers\Capsule;

use App\Http\Controllers\Controller;
use App\Packages\Capsule\Models\Capsule;
use App\Packages\Capsule\Repository\CapsuleRepository;
use App\Packages\Capsule\Services\CapsuleCreateService;
use App\Packages\Capsule\Services\CapsuleFactoryService;
use App\Packages\Capsule\Services\ImageFactoryService;
use App\Packages\Capsule\Transformer\CapsuleArrayTransformer;
use App\Packages\User\Models\User;
use App\Packages\User\Service\UserMentionService;
use App\PackagesApi\v3\Requests\Capsule\CompleteRequest;
use App\PackagesApi\v3\Requests\Capsule\TagFriendsRequest;
use App\PackagesApi\v3\Requests\Capsule\UploadPreviewRequest;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

/**
 * Class CreateController
 * @package App\PackagesApi\Controllers\v3\Capsule
 */
class CreateController extends Controller
{
    /** @var Capsule */
    private $capsule;
    /** @var User */
    private $user;

    public function __construct(Request $request)
    {
        $capsule = CapsuleRepository::init()->firstByUuid($request->get('capsule_id'));

        $this->capsule = $capsule;
        $this->user = user();
    }

    /**
     * @return JsonResponse
     */
    public function start()
    {
        $this->user->saveAccess('Start capsule creation');

        /** @var CapsuleFactoryService $createService */
        $createService = app()->make(CapsuleFactoryService::class);
        $capsule = $createService->startCreate($this->user);

        return jsonSuccess(
            [
                'capsule' => [
                    'capsule_id' => $capsule->uuid,
                ],
            ]
        );
    }

    /**
     * @return JsonResponse
     *
     * @throws \Exception
     */
    public function cancel()
    {
        $this->user->saveAccess('Cancel capsule creation');

        /** @var CapsuleCreateService $createService */
        $createService = app()->make(CapsuleCreateService::class);
        $createService->cancelCreate($this->capsule);

        return jsonSuccess();
    }

    /**
     * @return JsonResponse
     *
     * @throws \Exception
     */
    public function destroy()
    {
        $this->user->saveAccess('Destroy capsule');

        /** @var CapsuleCreateService $createService */
        $createService = app()->make(CapsuleCreateService::class);
        $createService->destroyCapsule($this->capsule);

        return jsonSuccess();
    }

    /**
     * @param CompleteRequest $request
     *
     * @return JsonResponse
     *
     * @throws \App\Packages\Core\Exceptions\RecordExistsException
     */
    public function complete(CompleteRequest $request)
    {
        $this->user->saveAccess('Complete capsule creation');

        /** @var CapsuleFactoryService $createService */
        $createService = app()->make(CapsuleFactoryService::class);
        $createService->completeCreate($this->capsule, $request);

        UserMentionService::processCapsuleCaption($this->capsule);

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

    /**
     * @param TagFriendsRequest $request
     *
     * @return JsonResponse
     *
     * @throws \App\Packages\Core\Exceptions\RecordExistsException
     */
    public function tagFriends(TagFriendsRequest $request)
    {
        $this->user->saveAccess('Tag friends to capsule');

        /** @var CapsuleFactoryService $createService */
        $createService = app()->make(CapsuleFactoryService::class);
        $createService->tagFriends($this->capsule, $request);

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

    /**
     * @param UploadPreviewRequest $request
     * @param $imageService $imageService
     *
     * @return JsonResponse
     */
    public function uploadPreview(UploadPreviewRequest $request, ImageFactoryService $imageService)
    {
        set_time_limit(180);
        ini_set('memory_limit', '712M');

        $this->user->saveAccess('Upload preview to capsule');

        $imageService->uploadAllImages($this->capsule, $request);

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