<?php

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

use Exception;
use Illuminate\Support\Facades\Log;
use Seka\Vzdelavanie\Dtos\Kniznica\UcebnicaDTO;
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\UcebnyMaterialOpened;
use Seka\Vzdelavanie\Services\Kniznica\NavigaciaSekciamiUcebnehoMaterialuFactory;

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

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

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

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

        try {
            /** @var \Seka\Vzdelavanie\Models\Kniznica\Ucebnica $ucebnyText */
            $ucebnyText = $this->ucebnicaService->vratUcebnyText($vzdKnzncUcbnMtrlId);
            $sekcie = $this->sekciaService->vratZoznamSekciiUcebnehoTextu($vzdKnzncUcbnMtrlId, true);
            $sekcie = SekciaCollectionDTO::fromCollection($sekcie)->items();

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

            event(
                new UcebnyMaterialOpened(UcebnicaDTO::fromModel($ucebnyText))
            );
        } 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)
                ->withSekcie($sekcie);
        }
    }
}
