<?php

declare(strict_types=1);

namespace Seka\Portal\Modul\Vzdelavanie\Database\Seeders;

use Illuminate\Database\Seeder;
use Seka\Portal\Modul\Vzdelavanie\Enums\ModelStatusEnum;
use Seka\Portal\Modul\Vzdelavanie\Models\Testovanie\DruhSpravnejOdpovedeEnum;
use Seka\Portal\Modul\Vzdelavanie\Models\Testovanie\HodnotenieOdpovedeEnum;
use Seka\Portal\Modul\Vzdelavanie\Models\Testovanie\Odpoved;
use Seka\Portal\Modul\Vzdelavanie\Models\Testovanie\Otazka;
use Seka\Portal\Modul\Vzdelavanie\Models\Testovanie\Test;

/**
 * Class VzdelavanieTestovanieSeeder
 *
 * @package Seka\Portal\Modul\Vzdelavanie\Database\Seeders
 */
class VzdelavanieTestovanieSeeder extends Seeder
{
    public function run(): void
    {
        collect([
            'Legislatíva',
            'Metodika',
            'Konštrukcia',
            'Meracie zariadenia',
            'Plyn',
            'Príklady',
        ])->each(function ($nazovTestu) {
            $test = Test::factory()
                ->create([
                    'nazov' => $nazovTestu,
                    'stav' => ModelStatusEnum::PUBLIKOVANE,
                ]);

            Otazka::factory()
                ->count(rand($test->pocet_otazok, $test->pocet_otazok + 10))
                ->make([
                    'druh_spravnej_odpovede' => DruhSpravnejOdpovedeEnum::JEDNA,
                ])
                ->each(function (Otazka $otazka) use ($test) {
                    $otazka->test()->associate($test);
                    $otazka->save();

                    Odpoved::factory()
                        ->count(rand(5, 8))
                        ->make()
                        ->each(function (Odpoved $odpoved) use ($otazka) {
                            $odpoved->otazka()->associate($otazka);
                            // vsetky odpovede budu nastavene ako nespravne, neskor sa jedna nastavi ako spravna
                            $odpoved->setAttribute('hodnotenie', HodnotenieOdpovedeEnum::NESPRAVNA);
                            $odpoved->save();
                        });

                    // nastavenie jednej odpovede ako spravnej
                    $otazka->odpovede()->inRandomOrder()->first()->setAttribute(
                        'hodnotenie',
                        HodnotenieOdpovedeEnum::SPRAVNA,
                    )->save();
                });
        });
    }
}
