<?php

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

use Exception;
use Illuminate\Support\Facades\Log;
use Seka\Vzdelavanie\Dtos\Kniznica\SekciaDTO;
use Seka\Vzdelavanie\Http\Controllers\Controller;
use Seka\Vzdelavanie\Services\SekciaServiceInterface;
use Seka\Vzdelavanie\Http\Requests\SekcieStoreRequest;
use Seka\Vzdelavanie\Services\UcebnicaServiceInterface;
use Seka\Vzdelavanie\Services\KategoriaServiceInterface;
use Seka\Vzdelavanie\Events\Kniznica\Backend\SekciaCreated;
use Seka\Vzdelavanie\Events\Kniznica\Backend\SekciaUpdated;
use Seka\Vzdelavanie\Events\Kniznica\Backend\SekciaDeleted;
use Seka\Vzdelavanie\Dtos\Kniznica\Backend\SekciaCollectionDTO;

/**
 * Class SekciaController
 * @package Seka\Vzdelavanie\Http\Controllers\Backend\Kniznica
 */
final class SekciaController extends Controller
{
    /**
     * @var \Seka\Vzdelavanie\Services\SekciaServiceInterface
     */
    protected $sekciaService;

    /**
     * @var \Seka\Vzdelavanie\Services\UcebnicaServiceInterface
     */
    protected $ucebnyMaterialService;

    /**
     * @var \Seka\Vzdelavanie\Services\KategoriaServiceInterface
     */
    private KategoriaServiceInterface $kategoriaService;

    /**
     * SekciaController constructor.
     *
     * @param \Seka\Vzdelavanie\Services\SekciaServiceInterface    $sekciaService
     * @param \Seka\Vzdelavanie\Services\KategoriaServiceInterface $kategoriaService
     * @param \Seka\Vzdelavanie\Services\UcebnicaServiceInterface  $ucebnyMaterialService
     */
    public function __construct(
        SekciaServiceInterface $sekciaService,
        KategoriaServiceInterface $kategoriaService,
        UcebnicaServiceInterface $ucebnyMaterialService
    ) {
        $this->sekciaService = $sekciaService;
        $this->kategoriaService = $kategoriaService;
        $this->ucebnyMaterialService = $ucebnyMaterialService;
    }

    /**
     * @param int $vzdKnzncKategoriaId
     * @param int $vzdKnzncUcbnMtrlId
     *
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    public function index(int $vzdKnzncKategoriaId, int $vzdKnzncUcbnMtrlId)
    {
        $sekcie = null;
        $ucebnica = null;
        $kategoria = null;

        try {
            $kategoria = $this->kategoriaService->vratKategoriuSUcebnymiMaterialmi($vzdKnzncKategoriaId);
            $ucebnica = $this->ucebnyMaterialService->vratUcebnyText($vzdKnzncUcbnMtrlId);
            $sekcie = $this->sekciaService->vratZoznamSekciiUcebnehoTextu($vzdKnzncUcbnMtrlId, true);
            $sekcie = SekciaCollectionDTO::fromCollection($sekcie)->items();
        } catch (Exception $e) {
            Log::error($e->getMessage(), $e->getTrace());

            flash()->error($e->getMessage())->important();
        } finally {
            return view('Vzdelavanie::pages.sprava.kniznica.sekcie.index')
                ->withKategoria($kategoria)
                ->withUcebnica($ucebnica)
                ->withSekcie($sekcie);
        }
    }

    /**
     * @param int $vzdKnzncKategoriaId
     * @param int $vzdKnzncUcbnMtrlId
     *
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    public function create(int $vzdKnzncKategoriaId, int $vzdKnzncUcbnMtrlId)
    {
        $sekcie = null;
        $ucebnica = null;
        $kategoria = null;
        $actionRoute = null;
        $sekciaId = request('sekciaId', null);

        try {
            $kategoria = $this->kategoriaService->vratKategoriuSUcebnymiMaterialmi($vzdKnzncKategoriaId);
            $ucebnica = $this->ucebnyMaterialService->vratUcebnyText($vzdKnzncUcbnMtrlId);
            $sekcie = $this->sekciaService->vratZoznamSekciiUcebnehoTextu($ucebnica->id, true);
            $sekcie = SekciaCollectionDTO::fromCollection($sekcie)->items();
            $actionRoute = route('vzdelavanie.sprava.kniznica.kategoria.ucebnice.sekcia.store', [$kategoria, $ucebnica]);
        } catch (Exception $e) {
            Log::error($e->getMessage(), $e->getTrace());

            flash()->error($e->getMessage())->important();
        } finally {
            return view('Vzdelavanie::pages.sprava.kniznica.sekcie.nova')
                ->withActionRoute($actionRoute)
                ->withKategoria($kategoria)
                ->withUcebnica($ucebnica)
                ->withSekciaId($sekciaId)
                ->withSekcie($sekcie);
        }
    }

    /**
     * @param \Seka\Vzdelavanie\Http\Requests\SekcieStoreRequest $request
     * @param int                                                $vzdKnzncKategoriaId
     * @param int                                                $vzdKnzncUcbnMtrlId
     *
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function store(SekcieStoreRequest $request, int $vzdKnzncKategoriaId, int $vzdKnzncUcbnMtrlId)
    {
        try {
            $sekciaId = request('sekciaId', null);
            $sekcia = $this->sekciaService->vytvoritSekciuUcebnehoTextu($vzdKnzncUcbnMtrlId, $request->all(['nazov', 'obsah']), $sekciaId);
            $kategoria = $this->kategoriaService->vratKategoriuSUcebnymiMaterialmi($vzdKnzncKategoriaId);
            $ucebnica = $this->ucebnyMaterialService->vratUcebnyText($vzdKnzncUcbnMtrlId);

            flash()->success('Sekcia bola vytvorená.')->important();

            event(new SekciaCreated(SekciaDTO::fromModel($sekcia)));
        } catch (Exception $e) {
            Log::error($e->getMessage(), $e->getTrace());

            flash()->error($e->getMessage())->important();

            return back()->withInput($request->all());
        }

        return redirect(route('vzdelavanie.sprava.kniznica.kategoria.ucebnice.sekcia.edit', [$kategoria, $ucebnica, $sekcia]));
    }

    /**
     * @param int $vzdKnzncKategoriaId
     * @param int $vzdKnzncUcbnMtrlId
     * @param int $vzdKnzncSekciaId
     *
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    public function edit(int $vzdKnzncKategoriaId, int $vzdKnzncUcbnMtrlId, int $vzdKnzncSekciaId)
    {
        $sekcia = null;
        $sekcie = null;
        $ucebnica = null;
        $kategoria = null;
        $actionRoute = null;

        try {
            $kategoria = $this->kategoriaService->vratKategoriuSUcebnymiMaterialmi($vzdKnzncKategoriaId);
            $ucebnica = $this->ucebnyMaterialService->vratUcebnyText($vzdKnzncUcbnMtrlId);
            $sekcia = $this->sekciaService->vratSekciu($vzdKnzncSekciaId);
            $sekcie = $this->sekciaService->vratZoznamSekciiUcebnehoTextu($ucebnica->getKey(), true);
            $sekcie = SekciaCollectionDTO::fromCollection($sekcie)->items();
            $actionRoute = route('vzdelavanie.sprava.kniznica.kategoria.ucebnice.sekcia.update', [$kategoria, $ucebnica, $sekcia]);
        } catch (Exception $e) {
            Log::error($e->getMessage(), $e->getTrace());

            flash()->error($e->getMessage())->important();
        } finally {
            return view('Vzdelavanie::pages.sprava.kniznica.sekcie.upravit')
                ->withSekciaId($vzdKnzncSekciaId)
                ->withActionRoute($actionRoute)
                ->withUcebnica($ucebnica)
                ->withKategoria($kategoria)
                ->withSekcia($sekcia)
                ->withSekcie($sekcie);
        }
    }

    /**
     * @param \Seka\Vzdelavanie\Http\Requests\SekcieStoreRequest $request
     * @param int                                                $vzdKnzncKategoriaId
     * @param int                                                $vzdKnzncUcbnMtrlId
     * @param int                                                $vzdKnzncSekciaId
     *
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function update(SekcieStoreRequest $request, int $vzdKnzncKategoriaId, int $vzdKnzncUcbnMtrlId, int $vzdKnzncSekciaId)
    {
        try {
            $this->sekciaService->upravit($vzdKnzncSekciaId, $request->only(['nazov', 'obsah']));

            $kategoria = $this->kategoriaService->vratKategoriuSUcebnymiMaterialmi($vzdKnzncKategoriaId);
            $ucebnica = $this->ucebnyMaterialService->vratUcebnyText($vzdKnzncUcbnMtrlId);
            $sekcia = $this->sekciaService->vratSekciu($vzdKnzncSekciaId);

            flash()->success('Sekcia bola upravená.')->important();

            event(new SekciaUpdated(SekciaDTO::fromModel($sekcia)));
        } catch (Exception $e) {
            Log::error($e->getMessage(), $e->getTrace());

            flash()->error($e->getMessage())->important();

            return back()->withInput($request->all());
        }

        return redirect(route('vzdelavanie.sprava.kniznica.kategoria.ucebnice.sekcia.edit', [$kategoria, $ucebnica, $sekcia]));
    }

    /**
     * @param int $vzdKnzncKategoriaId
     * @param int $vzdKnzncUcbnMtrlId
     * @param int $vzdKnzncSekciaId
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function destroy(int $vzdKnzncKategoriaId, int $vzdKnzncUcbnMtrlId, int $vzdKnzncSekciaId)
    {
        $sekcia = null;
        $ucebnica = null;

        try {
            $sekcia = $this->sekciaService->vratSekciu($vzdKnzncSekciaId);
            $ucebnica = $this->ucebnyMaterialService->vratUcebnyText($vzdKnzncUcbnMtrlId);

            $this->sekciaService->odstranSekciu($vzdKnzncUcbnMtrlId, $vzdKnzncSekciaId);

            flash()->success('Sekcia bola odstránená.')->important();

            event(new SekciaDeleted(SekciaDTO::fromModel($sekcia)));
        } catch (Exception $e) {
            Log::error($e->getMessage(), $e->getTrace());

            flash()->error($e->getMessage())->important();

            return back();
        } finally {
            return redirect(route('vzdelavanie.kniznica.ucebnica.sekcia.index', $ucebnica));
        }
    }
}
