<?php

namespace App\Console\Commands\Capsule;

use App\Packages\Capsule\Jobs\HatchCapsules;
use App\Packages\Capsule\Models\Capsule;
use App\Packages\Capsule\Models\CapsulePreview;
use App\Packages\Capsule\Models\CapsuleVideo;
use App\Packages\Capsule\Services\CapsuleImageUploadService;
use App\Packages\Capsule\Services\CapsuleService;
use App\Packages\Capsule\Services\CapsuleTeaserUploadService;
use App\Packages\Capsule\Services\CapsuleVideoUploadService;
use App\Packages\User\Models\User;
use App\Packages\User\Service\UserImageUploadService;
use Illuminate\Console\Command;
use Illuminate\Queue\Worker;
use Illuminate\Queue\WorkerOptions;
use Illuminate\Support\Collection;
use Log;

/**
 * Class CapsuleHatchCommand
 * @package App\Console\Commands
 */
class CapsuleCleanUpCommand extends Command
{
    protected $signature = 'capsule:cleanup';

    public function handle()
    {
        /** @var UserImageUploadService $service */
        $service = app()->make(UserImageUploadService::class);

        /** Force delete all users and mark capsules as deleted */
        $users = User::repository()->trashedUsers();
        $users->each(function (User $user) use ($service) {

            try {
                if ($user->avatar) {
                    $service->removeUploadedAvatar($user->avatar);
                    $user->avatar->forceDelete();
                }
            } catch (\Exception $e) {

                $user->avatar->forceDelete();

                Log::channel('slack')
                    ->emergency($user->id . " ". $e->getMessage());
            }

            /** Soft delete capsules */
            $user->capsules()->update(['deleted_at' => now()]);
            /** Delete user */
            $user->delete();

            /** @var @TODO: Refactore $likedCapsules */
            $likedCapsules = Capsule::repository()->getCapsulesLikesByUser($user);
            $commentedCapsules = Capsule::repository()->getCapsulesCommentedByUser($user);
            $subscribedCapsules = Capsule::repository()->getCapsulesSubscribedByUser($user);

            $user->forceDelete();

            /** Refresh likes */
            $likedCapsules->each(function(Capsule $capsule) {
               $capsule->refreshLikeCount();
            });

            /** Refresh comments */
            $commentedCapsules->each(function(Capsule $capsule) {
                $capsule->refreshCommentCount();
            });

            /** Refresh subscribers */
            $subscribedCapsules->each(function(Capsule $capsule) {
                $capsule->refreshSubscribersCount();
            });
        });

        /** Remove all uncompleted capsules */
        $unCompleteCapsules = Capsule::repository()->oldUnCompleteCapsules();
        $unCompleteCapsules->each(function (Capsule $capsule) {
            $capsule->delete();
        });

        /** @var CapsuleVideoUploadService $videoService */
        $videoService = app()->make(CapsuleVideoUploadService::class);

        /** @var CapsuleTeaserUploadService $teaserService */
        $teaserService = app()->make(CapsuleTeaserUploadService::class);

        /** @var CapsuleImageUploadService $imageService */
        $imageService = app()->make(CapsuleImageUploadService::class);

        /** Fully delete capsules */
        $capsules = Capsule::repository()->trashedCapsules();
        $capsules->each(function (Capsule $capsule) use ($imageService, $videoService, $teaserService) {

            try {
                if ($capsule->video) {
                    $videoService->removeUploadedVideo($capsule->video);
                    $capsule->video->forceDelete();
                }
            } catch (\Exception $e) {

                $capsule->video->forceDelete();

                Log::channel('slack')
                    ->emergency($capsule->id . " ". $e->getMessage());
            }

            try {
                if ($capsule->teaser) {
                    $teaserService->removeUploadedTeaser($capsule->teaser);
                    $capsule->teaser->forceDelete();
                }
            } catch (\Exception $e) {

                $capsule->teaser->forceDelete();

                Log::channel('slack')
                    ->emergency($capsule->id . " " . $e->getMessage());
            }

            try {
                if ($capsule->preview) {
                    $imageService->removeUploadedImage($capsule->preview);
                    $capsule->preview->forceDelete();
                }
            } catch (\Exception $e) {

                $capsule->preview->forceDelete();

                Log::channel('slack')
                    ->emergency($capsule->id . " ". $e->getMessage());
            }

            try {
                if ($capsule->thumbnail) {
                    $imageService->removeUploadedImage($capsule->thumbnail);
                    $capsule->thumbnail->forceDelete();
                }
            } catch (\Exception $e) {
                $capsule->thumbnail->forceDelete();

                Log::channel('slack')
                    ->emergency($capsule->id . " ". $e->getMessage());
            }

            try {
                $capsule->forceDelete();
            } catch (\Exception $e) {
                Log::channel('slack')
                    ->emergency($capsule->id . " ". $e->getMessage());
            }

            $this->info('Fully removed capsule video');
        });
    }
}













