<?php

declare(strict_types=1);

namespace Seka\Vzdelavanie\Http\Controllers\Backend\Testovanie;

use Illuminate\Support\Str;
use Seka\Vzdelavanie\Models\Testovanie\Test;
use Seka\Vzdelavanie\Models\Testovanie\Otazka;
use Seka\Vzdelavanie\Models\Testovanie\Odpoved;
use Seka\Vzdelavanie\Http\Controllers\Controller;
use Seka\Vzdelavanie\Http\Requests\Sprava\Testovanie\Odpoved\OdpovedStoreRequest;

/**
 * Class TestOtazkyOdpovedeController
 *
 * @package Seka\Vzdelavanie\Http\Controllers\Backend\Testovanie
 */
final class TestOtazkyOdpovedeController extends Controller
{
    /**
     * @param int $vzdTstTstId
     * @param int $vzdTstOtzkId
     *
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\View\View|mixed
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    public function index(int $vzdTstTstId, int $vzdTstOtzkId)
    {
        $test = Test::query()->findOrFail($vzdTstTstId);
        $otazka = Otazka::query()->findOrFail($vzdTstOtzkId);
        $odpovede = $otazka->odpovede()->get();

        return view('Vzdelavanie::pages.sprava.testovanie.odpovede.index')
            ->withTest($test)
            ->withOtazka($otazka)
            ->withOdpovede($odpovede);
    }

    /**
     * @param int $vzdTstTstId
     * @param int $vzdTstOtzkId
     *
     * @return mixed
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    public function create(int $vzdTstTstId, int $vzdTstOtzkId)
    {
        $test = Test::query()->findOrFail($vzdTstTstId);
        $otazka = Otazka::query()->findOrFail($vzdTstOtzkId);
        $actionRoute = route('vzdelavanie.sprava.testovanie.testy.otazky.odpovede.store', [$test, $otazka]);

        return view('Vzdelavanie::pages.sprava.testovanie.odpovede.nova')
            ->withTest($test)
            ->withOtazka($otazka)
            ->withActionRoute($actionRoute);
    }

    /**
     * @param \Seka\Vzdelavanie\Http\Requests\Sprava\Testovanie\Odpoved\OdpovedStoreRequest $request
     * @param int                                                                           $vzdTstTstId
     * @param int                                                                           $vzdTstOtzkId
     *
     * @return \Illuminate\Http\RedirectResponse
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     * @throws \Illuminate\Validation\ValidationException
     */
    public function store(OdpovedStoreRequest $request, int $vzdTstTstId, int $vzdTstOtzkId)
    {
        $test = Test::query()->findOrFail($vzdTstTstId);
        $otazka = Otazka::query()->findOrFail($vzdTstOtzkId);
        $odpoved = new Odpoved();
        $odpoved->fill($request->validated());
        $odpoved->otazka()->associate($otazka);
        $odpoved->save();
        $odpoved = $odpoved->refresh();

        flash()->success(sprintf('Odpoveď "<strong>%s</strong>" na otázku testu bola úspešne vytvorená.', Str::limit($odpoved->znenie, 25)));

        return response()->redirectToRoute(
            'vzdelavanie.sprava.testovanie.testy.otazky.odpovede.edit',
            [
                $test,
                $otazka,
                $odpoved,
            ]
        );
    }

    /**
     * @param int $vzdTstTstId
     * @param int $vzdTstOtzkId
     * @param int $vzdTstOdpvdId
     *
     * @return mixed
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    public function edit(int $vzdTstTstId, int $vzdTstOtzkId, int $vzdTstOdpvdId)
    {
        $edit = true;
        $test = Test::query()->findOrFail($vzdTstTstId);
        $otazka = Otazka::query()->findOrFail($vzdTstOtzkId);
        $odpoved = Odpoved::query()->findOrFail($vzdTstOdpvdId);
        $actionRoute = route(
            'vzdelavanie.sprava.testovanie.testy.otazky.odpovede.update',
            [
                $test,
                $otazka,
                $odpoved,
            ]
        );

        return view('Vzdelavanie::pages.sprava.testovanie.odpovede.upravit')
            ->withEdit($edit)
            ->withTest($test)
            ->withOtazka($otazka)
            ->withOdpoved($odpoved)
            ->withActionRoute($actionRoute);
    }

    /**
     * @param \Seka\Vzdelavanie\Http\Requests\Sprava\Testovanie\Odpoved\OdpovedStoreRequest $request
     * @param int                                                                           $vzdTstTstId
     * @param int                                                                           $vzdTstOtzkId
     * @param int                                                                           $vzdTstOdpvdId
     *
     * @return \Illuminate\Http\RedirectResponse
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     * @throws \Illuminate\Validation\ValidationException
     */
    public function update(OdpovedStoreRequest $request, int $vzdTstTstId, int $vzdTstOtzkId, int $vzdTstOdpvdId)
    {
        $test = Test::query()->findOrFail($vzdTstTstId);
        $otazka = Otazka::query()->findOrFail($vzdTstOtzkId);
        $odpoved = Odpoved::query()->findOrFail($vzdTstOdpvdId);
        $odpoved->fill($request->validated());
        $odpoved->save();

        flash()->success(sprintf('Odpoveď "<strong>%s</strong>" na otázku testu bola úspešne upravená.', Str::limit($odpoved->znenie, 25)));

        return response()->redirectToRoute(
            'vzdelavanie.sprava.testovanie.testy.otazky.odpovede.edit',
            [
                $test,
                $otazka,
                $odpoved,
            ]
        );
    }

    /**
     * @param int $vzdTstTstId
     * @param int $vzdTstOtzkId
     * @param int $vzdTstOdpvdId
     *
     * @return \Illuminate\Http\RedirectResponse
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    public function destroy(int $vzdTstTstId, int $vzdTstOtzkId, int $vzdTstOdpvdId)
    {
        $test = Test::query()->findOrFail($vzdTstTstId);
        $otazka = Otazka::query()->findOrFail($vzdTstOtzkId);
        $odpoved = Odpoved::query()->findOrFail($vzdTstOdpvdId);
        $odpoved->delete();

        flash()->success(sprintf('Otázka "<strong>%s</strong>" testu bola úspešne odstránená.', Str::limit($odpoved->znenie, 25)));

        return response()->redirectToRoute(
            'vzdelavanie.sprava.testovanie.testy.otazky.odpovede.index',
            [
                $test,
                $otazka,
            ]
        );
    }
}
