<?php

declare(strict_types=1);

namespace Seka\Portal\Modul\Vzdelavanie\Services\Pouzivatel\Testovanie;

use Exception;
use Illuminate\Support\Facades\Auth;
use Seka\Portal\Modul\Vzdelavanie\Models\Pouzivatel\Testovanie\Otazka;
use Seka\Portal\Modul\Vzdelavanie\Models\Pouzivatel\Testovanie\Test;
use Seka\Portal\Modul\Vzdelavanie\Services\Pouzivatel\Testovanie\Exceptions\TestNieJeMozneVyhodnotitException;
use Seka\Portal\Modul\Vzdelavanie\Services\Pouzivatel\Testovanie\Exceptions\TestUzBolVyhodnotenyException;

/**
 * Class UlozenieOdpovediPouzivatela
 *
 * @package Seka\Portal\Modul\Vzdelavanie\Services\Pouzivatel\Testovanie
 */
final class UlozenieOdpovediPouzivatela
{
    /**
     * @param \Seka\Portal\Modul\Vzdelavanie\Models\Pouzivatel\Testovanie\Test $test
     * @param array                                                            $data
     *
     * @throws \Seka\Portal\Modul\Vzdelavanie\Services\Pouzivatel\Testovanie\Exceptions\TestUzBolVyhodnotenyException
     * @throws \Throwable
     */
    public static function ulozit(Test $test, array $data)
    {
        if ($test->jeVyhodnoteny()) {
            throw new TestUzBolVyhodnotenyException();
        }

        $otazky = collect($data['otazky']);

        if ($test->otazky->count() !== $otazky->count()) {
            throw new TestNieJeMozneVyhodnotitException('Nie je zhodný počet otázok.');
        }

        $otazky->each(function (array $otazka) use ($test) {
            /** @var Otazka $_otazka */
            $_otazka = $test->otazky->where('id', $otazka['id'])->first();

            // ak otazka nepatri do ukladaneho testu pouzivatela
            if ($test->pouzivatel_id !== Auth::id()) {
                throw new Exception('Otazka nepatri do testu pouzivatela...');
            }

            // ak otazka nepatri pod ukladany test pouzivatela
            if ($_otazka->test->id !== $test->id) {
                throw new Exception('Otazka nepatri pod ukladany test pouzivatela...');
            }

            $odpovede = collect($otazka['odpovede']);

            $odpovede->each(function (array $odpoved) use ($test, $_otazka) {
                $_odpoved = $_otazka->odpovede->where('id', $odpoved['id'])->first();

                if ($_otazka->id !== $odpoved['otazka_id']) {
                    throw new Exception('Odpoved nepatri pod pozadovanu otazku...');
                }

                if ($_otazka->test->id !== $test->id) {
                    throw new Exception('Odpoved nepatri pod test...');
                }

                $_odpoved->setAttribute('zvolena', (bool)$odpoved['zvolena']);
                $_odpoved->saveOrFail();
            });
        });
    }
}
