<?php

namespace App\PackagesApi\v3\Controllers\Tools;

use App\Http\Controllers\Controller;
use App\Packages\Capsule\Models\Capsule;
use App\Packages\Capsule\Models\CapsuleComment;
use App\Packages\Capsule\Repository\CapsuleRepository;
use App\Packages\User\Manager\UserEntityManager;
use App\Packages\User\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;

/**
 * Class CapsuleController
 * @package App\PackagesApi\Controllers\v1
 */
class TestController extends Controller
{
    /** @var Capsule */
    private $capsule;

    /** @var User */
    private $user;

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

    /**
     * @return JsonResponse
     */
    public function randomize()
    {
        $capsules = CapsuleRepository::init()->getUserAllCompleteCapsules($this->user);

        $chunks = $capsules->split(2);
        $chunks->each(
            function ($capsulesChunk, $key) {

                /** @var Collection|Capsule[] $capsulesChunk */
                $capsulesChunk->each(
                    function ($capsule) use ($key) {
                        switch ($key) {
                            case 0:
                                $status = Capsule::STATUS_HATCHED;
                                $openAt = now()->subSeconds(rand(0, 50));

                                break;
                            case 1:
                                $status = Capsule::STATUS_LOCKED;
                                $openAt = now()->addMinutes(rand(3, 12))->addSeconds(rand(5, 30));

                                break;
                        }

                        /** @var Capsule $capsule */
                        $capsule->status = $status;
                        $capsule->open_at = $openAt;
                        $capsule->save();
                    }
                );
            }
        );

        return jsonSuccess();
    }

    /**
     * @param Request $request
     *
     * @return JsonResponse
     */
    public function duplicate(Request $request)
    {
        $capsuleUuid = $request->get('capsule_id');
        $count = $request->get('count');

        $this->capsule = CapsuleRepository::init()->firstByUuid($capsuleUuid);

        if (!$this->capsule || !$this->capsule->is_complete) {
            return jsonErrorEntity(
                [
                    'message' => 'Capsule is not completed',
                ]
            );
        }

        for ($i = 1; $i <= $count; $i++) {

            $capsule = new Capsule();
            $capsule->user_id = $this->capsule->user_id;
            $capsule->video_id = $this->capsule->video_id;
            $capsule->preview_id = $this->capsule->preview_id;
            $capsule->thumbnail_id = $this->capsule->thumbnail_id;
            $capsule->address_id = $this->capsule->address_id;
            $capsule->status = $this->capsule->status;
            $capsule->is_private = $this->capsule->is_private;
            $capsule->is_complete = $this->capsule->is_complete;
            $capsule->caption = $this->capsule->caption;
            $capsule->count_likes = $this->capsule->count_likes;
            $capsule->count_comments = $this->capsule->count_comments;
            $capsule->count_subscribers = $this->capsule->count_subscribers;
            $capsule->count_tagged_users = $this->capsule->count_tagged_users;
            $capsule->open_at = $this->capsule->open_at;
            $capsule->save();

            factory(CapsuleComment::class, rand(0, 7))
                ->create()->each(
                    function (CapsuleComment $comment) use ($capsule) {

                        $comment->user_id = User::query()->orderByRaw('random()')->first()->id;
                        $comment->capsule_id = $capsule->id;
                        $comment->save();
                    }
                );
        }

        $capsules = CapsuleRepository::init()->getUserAllCompleteCapsules($this->user);

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

}
