<?php

namespace Seka\Vzdelavanie\Http\Controllers\Frontend\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\Services\UcebnicaServiceInterface;
use Seka\Vzdelavanie\Dtos\Kniznica\SekciaCollectionDTO;
use Seka\Vzdelavanie\Events\Kniznica\Frontend\SekciaOpened;
use Seka\Vzdelavanie\Services\Kniznica\NavigaciaSekciamiUcebnehoMaterialuFactory;

/**
 * Class SekciaController
 * @package Seka\Vzdelavanie\Http\Controllers\Frontend\Kniznica
 */
final 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
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    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')
                ->withUcebnica($ucebnica)
                ->withSekcie($sekcie);
        }
    }

    /**
     * @param int $vzdKnzncUcbnMtrlId
     * @param int $vzdKnzncSekciaId
     *
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    public function show(int $vzdKnzncUcbnMtrlId, int $vzdKnzncSekciaId)
    {
        $sekcia = null;
        $sekcie = null;
        $ucebnyText = null;
        $navigacia = null;

        try {
            $ucebnyText = $this->ucebnyMaterialService->vratUcebnyText($vzdKnzncUcbnMtrlId);
            $sekcia = $this->sekciaService->vratSekciu($vzdKnzncSekciaId);
            $sekcie = $this->sekciaService->vratZoznamSekciiUcebnehoTextu($ucebnyText->getKey(), true);
            $sekcie = SekciaCollectionDTO::fromCollection($sekcie)->items();

            $navigacia = NavigaciaSekciamiUcebnehoMaterialuFactory::navigacia(
                $this->sekciaService->vratZoznamSekciiUcebnehoTextu($vzdKnzncUcbnMtrlId, false),
                $sekcia,
                $ucebnyText,
                'vzdelavanie.kniznica.ucebnica.sekcia.show'
            );

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

            flash()->error($e->getMessage())->important();
        } finally {
            return view('Vzdelavanie::pages.kniznica.ucebne_materialy.show')
                ->withNavigacia($navigacia)
                ->withUcebnyText($ucebnyText)
                ->withSekcia($sekcia)
                ->withSekcie($sekcie);
        }
    }
}
