<?php

namespace App\Console\Commands\Mock;

use App\Packages\Capsule\Models\Capsule;
use App\Packages\Capsule\Models\CapsulePreview;
use App\Packages\Capsule\Models\CapsuleVideo;
use App\Packages\User\Models\User;
use DB;
use Illuminate\Console\Command;

class MockCapsuleCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'mock:capsule';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Create mock capsules for all users';

    /**
     * MockCapsuleCommand constructor.
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $users = User::repository()->getRegisteredUsers();

        if (!$users) {
            $this->info('No registered users');
            return false;
        }

        $total_capsules = (int) $this->ask('Capsules per user num.') ? : 10;

        $statusBar = $this->output->createProgressBar($users->count());
        $statusBar->start();

        foreach ($users as $user) {
            DB::transaction(function () use ($total_capsules, $user) {
                factory(Capsule::class, $total_capsules)
                    ->create()->each(function (Capsule $capsule) use ($user) {

                        $randStatus = rand(1, 2);
                        switch ($randStatus) {
                            case 1:
                                $capsule->status = Capsule::STATUS_HATCHED;
                                $capsule->open_at = now();
                                break;

                            case 2:
                                $capsule->status = Capsule::STATUS_LOCKED;
                                $capsule->open_at = now()->addDays(rand(3, 120));
                                break;
                        }

                        $preview = CapsulePreview::query()->orderByRaw('random()')->first();
                        $video = CapsuleVideo::query()->orderByRaw('random()')->first();

                        $capsule->preview_id = $preview->id;
                        $capsule->thumbnail_id = $preview->id;
                        $capsule->video_id = $video->id;

                        $capsule->is_complete = true;
                        $capsule->is_private = false;

                        $capsule->user_id = $user->id;
                        $capsule->save();
                    });
            });

            $statusBar->advance();
        }

        $statusBar->finish();
        $this->info('');

        return true;
    }
}
