<?php

namespace Seka\Vzdelavanie\Http\Controllers\Kniznica;

use Exception;
use Illuminate\Support\Facades\Log;
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\Kniznica\NavigaciaSekciamiUcebnehoMaterialuFactory;

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

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

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

    /**
     * @param int $ucebnicaId
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function index(int $ucebnicaId)
    {
        $sekcie = null;
        $ucebnica = null;

        try {
            $ucebnica = $this->ucebnyMaterialService->vratUcebnyText($ucebnicaId);
            $sekcie = $this->sekciaService->vratZoznamSekciiUcebnehoTextu($ucebnicaId, true);
        } catch (Exception $e) {
            Log::error($e->getMessage(), $e->getTrace());

            flash()->error($e->getMessage())->important();
        } finally {
            return view('Vzdelavanie::pages.kniznica.sekcie.index', compact('ucebnica', 'sekcie'));
        }
    }

    /**
     * @param int $id
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function create(int $id)
    {
        $sekcie = null;
        $ucebnica = null;
        $sekciaId = request('sekciaId', null);

        try {
            $ucebnica = $this->ucebnyMaterialService->vratUcebnyText($id);
            $sekcie = $this->sekciaService->vratZoznamSekciiUcebnehoTextu($ucebnica->id, true);
        } catch (Exception $e) {
            Log::error($e->getMessage(), $e->getTrace());

            flash()->error($e->getMessage())->important();
        } finally {
            return view('Vzdelavanie::pages.kniznica.sekcie.nova', compact('ucebnica', 'sekcie', 'sekciaId'));
        }
    }

    /**
     * @param int $id
     * @param int $sekciaId
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function edit(int $id, int $sekciaId)
    {
        $sekcia = null;
        $sekcie = null;
        $ucebnica = null;

        try {
            $ucebnica = $this->ucebnyMaterialService->vratUcebnyText($id);
            $sekcia = $this->sekciaService->vratSekciu($sekciaId);
            $sekcie = $this->sekciaService->vratZoznamSekciiUcebnehoTextu($ucebnica->getKey(), true);
        } catch (Exception $e) {
            Log::error($e->getMessage(), $e->getTrace());

            flash()->error($e->getMessage())->important();
        } finally {
            return view(
                'Vzdelavanie::pages.kniznica.sekcie.upravit',
                compact('ucebnica', 'sekcie', 'sekcia', 'sekciaId')
            );
        }
    }

    /**
     * @param \Seka\Vzdelavanie\Http\Requests\SekcieStoreRequest $request
     * @param int                                                $id
     * @param int                                                $sekciaId
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function update(SekcieStoreRequest $request, int $id, int $sekciaId)
    {
        try {
            $this->sekciaService->upravit($sekciaId, $request->only(['nazov', 'obsah']));
            flash()->success('Sekcia bola upravená.')->important();
        } catch (Exception $e) {
            Log::error($e->getMessage(), $e->getTrace());

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

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

        return redirect(route('vzdelavanie.kniznica.ucebnica.sekcia.edit', compact('id', 'sekciaId')));
    }

    /**
     * @param int $ucebnyTextId
     * @param int $sekciaId
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function show(int $ucebnyTextId, int $sekciaId)
    {
        $sekcia = null;
        $sekcie = null;
        $ucebnyText = null;
        $navigacia = null;

        try {
            $ucebnyText = $this->ucebnyMaterialService->vratUcebnyText($ucebnyTextId);
            $sekcie = $this->sekciaService->vratZoznamSekciiUcebnehoTextu($ucebnyText->getKey(), true);
            $sekcia = $this->sekciaService->vratSekciu($sekciaId);

            $navigacia = NavigaciaSekciamiUcebnehoMaterialuFactory::navigacia(
                $this->sekciaService->vratZoznamSekciiUcebnehoTextu($ucebnyTextId, false)->pluck('id'),
                $sekcia,
                $ucebnyTextId,
                'vzdelavanie.kniznica.ucebnica.sekcia.show'
            );
        } catch (Exception $e) {
            Log::error($e->getMessage(), $e->getTrace());

            flash()->error($e->getMessage())->important();
        } finally {
            return view(
                'Vzdelavanie::pages.kniznica.ucebne_materialy.nahlad',
                compact('ucebnyText', 'sekcie', 'sekcia', 'navigacia')
            );
        }
    }

    /**
     * @param \Seka\Vzdelavanie\Http\Requests\SekcieStoreRequest $request
     * @param int                                                $id
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function store(SekcieStoreRequest $request, int $id)
    {
        try {
            $sekciaId = request('sekciaId', null);
            $sekcia = $this->sekciaService->vytvoritSekciuUcebnehoTextu($id, $request->all(['nazov', 'obsah']), $sekciaId);
            $sekciaId = $sekcia->id;
        } catch (Exception $e) {
            Log::error($e->getMessage(), $e->getTrace());

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

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

        return redirect(route('vzdelavanie.kniznica.ucebnica.sekcia.edit', compact('id', 'sekciaId')));
    }

    /**
     * @param int $id
     * @param int $sekciaId
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function destroy(int $id, int $sekciaId)
    {
        try {
            $this->sekciaService->odstranSekciu($id, $sekciaId);
            flash()->success('Sekcia bola odstránená.')->important();
        } 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', compact('id')));
        }
    }
}
