<?php

namespace Seka\Portal\Modul\Vzdelavanie\Commands\Console;

use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Collection;
use Seka\Portal\Modul\Vzdelavanie\Models\Pouzivatel\Testovanie\StavVyhodnoteniaTestuEnum;
use Seka\Portal\Modul\Vzdelavanie\Models\Pouzivatel\Testovanie\Test;

/**
 * Class SpracovanieNevyhodnotenychTestov
 *
 * @package Seka\Portal\Modul\Vzdelavanie\Commands\Console
 */
class SpracovanieNevyhodnotenychTestov extends Command
{
    /**
     * @var string
     */
    protected $signature = 'testy:nevyhodnotene
                            {--neodstranovat : Zobrazí zoznam testov, ktoré vyhovujú kritériám na ich odstránenie}';

    /**
     * @var string
     */
    protected $description = 'Odstráni testy, ktoré neboli vyhodnotené a boli vytvorené viac ako pred jedným mesiacom.';

    public function handle(): void
    {
        $vychodziDatum = Carbon::now()->subMonth();

        $testy = Test::where(
            'stav',
            '!=',
            StavVyhodnoteniaTestuEnum::VYHODNOTENY,
        )
            ->where('casova_znacka_spustenia', '<', $vychodziDatum)
            ->get();

        if ($this->option('neodstranovat')) {
            if ($testy->isEmpty()) {
                $this->info('Nenašli sa žiadne vyhovujúce testy.');

                return;
            }

            $this->createRecordsTable($testy);

            return;
        }

        if ($testy->isEmpty()) {
            $this->info('Nenašli sa žiadne testy na odstránenie.');
        } else {
            $this->createRecordsTable($testy);

            $pocetOdstranenychTestov = $testy->count();
            $testy->each->delete();

            $this->info("Úspešne odstránených {$pocetOdstranenychTestov} testov.");
        }
    }

    protected function createRecordsTable(Collection $testy): void
    {
        $this->table(
            ['Meno používateľa', 'Pracovisko', 'Názov testu', 'Dátum vygenerovania'],
            $testy->map(function ($test) {
                $pouzivatel = $test->pouzivatel;
                return [
                    trim(
                        ($pouzivatel->meno ?? '') . ' ' . ($pouzivatel->priezvisko ?? '') . ' [' . $pouzivatel->login . ']',
                    ) ?: 'Neznámy používateľ',
                    $pouzivatel->pracovisko ? trim(
                        $pouzivatel->pracovisko->nazov . ' [' . $pouzivatel->pracovisko->kod . ']',
                    ) : '-',
                    $test->nazov,
                    $test->casova_znacka_spustenia->format('d.m.Y H:i:s'),
                ];
            })->toArray(),
        );
    }
}
