<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Seka\Portal\Modul\Vzdelavanie\Models\Pouzivatel\Testovanie\Otazka;
use Seka\Portal\Modul\Vzdelavanie\Models\Pouzivatel\Testovanie\Test;
use Seka\Portal\Modul\Vzdelavanie\Models\Testovanie\DruhSpravnejOdpovedeEnum;

/**
 * Class PridanyStlpecCasovejZnackySpusteniaTestuVzdelavaniePouzivatelTestovanieTestyTable
 */
return new class extends Migration {
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up(): void
    {
        Schema::table('vzdelavanie_pouzivatel_testovanie_testy', function (Blueprint $table) {
            $table
                ->addColumn('datetime', 'casova_znacka_spustenia')
                ->nullable()
                ->after('casova_znacka_vyhodnotenia');
            $table
                ->addColumn('integer', 'max_pocet_spravnych_odpovedi')
                ->default(0)
                ->after('druh_spravnej_odpovede');
            $table
                ->addColumn('integer', 'pocet_spravne_zodpovedanych_otazok')
                ->default(0)
                ->after('max_pocet_spravnych_odpovedi');
            $table
                ->addColumn('integer', 'pocet_nespravne_zodpovedanych_otazok')
                ->default(0)
                ->after('pocet_spravne_zodpovedanych_otazok');
            $table
                ->addColumn('integer', 'pocet_otazok_bez_odpovede')
                ->default(0)
                ->after('pocet_nespravne_zodpovedanych_otazok');
        });

        Test::all()->each(function (Test $test) {
            $maxPocetSpravnychOdpovedi = 0;

            $test->otazky()->each(function (Otazka $otazka) use (&$maxPocetSpravnychOdpovedi) {
                switch ($otazka->druh_spravnej_odpovede) {
                    case DruhSpravnejOdpovedeEnum::JEDNA:
                        $maxPocetSpravnychOdpovedi = $maxPocetSpravnychOdpovedi + 1;
                        break;
                    case DruhSpravnejOdpovedeEnum::MINIMALNE_JEDNA:
                        $maxPocetSpravnychOdpovedi = $maxPocetSpravnychOdpovedi + rand(1, 2);
                        break;
                    case DruhSpravnejOdpovedeEnum::DVE:
                        $maxPocetSpravnychOdpovedi = $maxPocetSpravnychOdpovedi + 2;
                        break;
                    case DruhSpravnejOdpovedeEnum::TRI:
                        $maxPocetSpravnychOdpovedi = $maxPocetSpravnychOdpovedi + 3;
                        break;
                }
            });

            $test->setAttribute('max_pocet_spravnych_odpovedi', $maxPocetSpravnychOdpovedi);
            $test->saveOrFail();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down(): void
    {
        Schema::table('vzdelavanie_pouzivatel_testovanie_testy', function (Blueprint $table) {
            $table->dropColumn('pocet_otazok_bez_odpovede');
            $table->dropColumn('casova_znacka_spustenia');
            $table->dropColumn('pocet_nespravne_zodpovedanych_otazok');
            $table->dropColumn('pocet_spravne_zodpovedanych_otazok');
            $table->dropColumn('max_pocet_spravnych_odpovedi');
        });
    }
};
