<?php

use Diglactic\Breadcrumbs\Breadcrumbs;
use Diglactic\Breadcrumbs\Exceptions\DuplicateBreadcrumbException;
use Illuminate\Contracts\Container\BindingResolutionException;
use Seka\Vzdelavanie\Models\Kniznica\Kategoria;
use Seka\Vzdelavanie\Models\Kniznica\Sekcia;
use Seka\Vzdelavanie\Models\Kniznica\Ucebnica;
use Seka\Vzdelavanie\Services\KategoriaServiceInterface as KategoriaService;
use Seka\Vzdelavanie\Services\SekciaService;
use Seka\Vzdelavanie\Services\UcebnicaServiceInterface as UcebnicaService;

try {
    $sekciaService = app(SekciaService::class);
    $ucebnicaService = app(UcebnicaService::class);
    $kategoriaService = app(KategoriaService::class);
} catch (BindingResolutionException $e) {
    Log::error($e);
}

try {
// Vzdelavanie > Kniznica
    Breadcrumbs::for('vzdelavanie.sprava.kniznica.index', function ($trail) {
        $trail->parent('vzdelavanie.sprava.index');
        $trail->push('Knižnica', route('vzdelavanie.sprava.kniznica.index'));
    });

// Vzdelavanie > Kniznica > Kategorie
    Breadcrumbs::for('vzdelavanie.sprava.kniznica.kategoria.index', function ($trail) {
        $trail->parent('vzdelavanie.sprava.kniznica.index');
        $trail->push('Kategórie', route('vzdelavanie.sprava.kniznica.kategoria.index'));
    });

// Vzdelavanie > Kniznica > Kategorie > Nova kategoria
    Breadcrumbs::for('vzdelavanie.sprava.kniznica.kategoria.create', function ($trail) {
        $trail->parent('vzdelavanie.sprava.kniznica.index');
        $trail->push('Nová kategória');
    });

// Vzdelavanie > Kniznica > Kategorie > [Kategoria] > Uprava
    Breadcrumbs::for(
        'vzdelavanie.sprava.kniznica.kategoria.edit',
        function ($trail, $vzdKnzncKategoriaId) use ($kategoriaService) {
            /** @var Kategoria $kategoria */
            $kategoria = $kategoriaService->vratPodlaId($vzdKnzncKategoriaId);

            $trail->parent('vzdelavanie.sprava.kniznica.index');
            $trail->push($kategoria->nazov, route('vzdelavanie.sprava.kniznica.kategoria.ucebnice.index', $kategoria));
            $trail->push('Úprava');
        },
    );

// Vzdelavanie > Kniznica > Kategorie > [Kategoria] > Ucebny material
    Breadcrumbs::for(
        'vzdelavanie.sprava.kniznica.kategoria.ucebnice.index',
        function ($trail, $vzdKnzncKategoriaId) use ($kategoriaService) {
            /** @var Kategoria $kategoria */
            $kategoria = $kategoriaService->vratPodlaId($vzdKnzncKategoriaId);

            $trail->parent('vzdelavanie.sprava.kniznica.index');
            $trail->push($kategoria->nazov, route('vzdelavanie.sprava.kniznica.kategoria.ucebnice.index', $kategoria));
        },
    );

// Vzdelavanie > Kniznica > Kategorie > [Kategoria] > Novy ucebny material
    Breadcrumbs::for(
        'vzdelavanie.sprava.kniznica.kategoria.ucebnice.create',
        function ($trail, $vzdKnzncKategoriaId) use ($kategoriaService) {
            /** @var Kategoria $kategoria */
            $kategoria = $kategoriaService->vratPodlaId($vzdKnzncKategoriaId);

            $trail->parent('vzdelavanie.sprava.kniznica.kategoria.ucebnice.index', $kategoria->id);
            $trail->push('Nový učebný meteriál');
        },
    );

// Vzdelavanie > Kniznica > Kategorie > [Kategoria] > [Ucebny material]
    Breadcrumbs::for(
        'vzdelavanie.sprava.kniznica.kategoria.ucebnice.edit',
        function ($trail, $vzdKnzncKategoriaId, $vzdKnzncUcbnMtrlId) use ($kategoriaService, $ucebnicaService) {
            /** @var Kategoria $kategoria */
            $kategoria = $kategoriaService->vratPodlaId($vzdKnzncKategoriaId);
            /** @var Ucebnica $ucebnica */
            $ucebnica = $ucebnicaService->vratUcebnyText($vzdKnzncUcbnMtrlId);

            $trail->parent('vzdelavanie.sprava.kniznica.kategoria.ucebnice.index', $kategoria->id);
            $trail->push(
                $ucebnica->nazov,
                route('vzdelavanie.sprava.kniznica.kategoria.ucebnice.edit', [$kategoria, $ucebnica]),
            );
            $trail->push('Úprava');
        },
    );

// Vzdelavanie > Kniznica > Kategorie > [Kategoria] > [Ucebny material] > Sekcie
    Breadcrumbs::for(
        'vzdelavanie.sprava.kniznica.kategoria.ucebnice.sekcia.index',
        function ($trail, $vzdKnzncKategoriaId, $vzdKnzncUcbnMtrlId) use ($kategoriaService, $ucebnicaService) {
            /** @var Kategoria $kategoria */
            $kategoria = $kategoriaService->vratPodlaId($vzdKnzncKategoriaId);
            /** @var Ucebnica $ucebnica */
            $ucebnica = $ucebnicaService->vratUcebnyText($vzdKnzncUcbnMtrlId);

            $trail->parent('vzdelavanie.sprava.kniznica.kategoria.ucebnice.edit', $kategoria->id, $ucebnica->id);
        },
    );

// Vzdelavanie > Kniznica > Kategorie > [Kategoria] > [Ucebny material] > Nova sekcia
    Breadcrumbs::for(
        'vzdelavanie.sprava.kniznica.kategoria.ucebnice.sekcia.create',
        function ($trail, $vzdKnzncKategoriaId, $vzdKnzncUcbnMtrlId) use ($kategoriaService, $ucebnicaService) {
            /** @var Kategoria $kategoria */
            $kategoria = $kategoriaService->vratPodlaId($vzdKnzncKategoriaId);
            /** @var Ucebnica $ucebnica */
            $ucebnica = $ucebnicaService->vratUcebnyText($vzdKnzncUcbnMtrlId);

            $trail->parent('vzdelavanie.sprava.kniznica.kategoria.ucebnice.edit', $kategoria->id, $ucebnica->id);
            $trail->push('Nová sekcia');
        },
    );

// Vzdelavanie > Kniznica > Kategorie > [Kategoria] > [Ucebny material] > [Sekcia]
    Breadcrumbs::for(
        'vzdelavanie.sprava.kniznica.kategoria.ucebnice.sekcia.edit',
        function ($trail, $vzdKnzncKategoriaId, $vzdKnzncUcbnMtrlId, $vzdKnzncSekciaId) use (
            $kategoriaService,
            $ucebnicaService,
            $sekciaService,
        ) {
            /** @var Kategoria $kategoria */
            $kategoria = $kategoriaService->vratPodlaId($vzdKnzncKategoriaId);
            /** @var Ucebnica $ucebnica */
            $ucebnica = $ucebnicaService->vratUcebnyText($vzdKnzncUcbnMtrlId);
            /** @var Sekcia $sekcia */
            $sekcia = $sekciaService->vratSekciu($vzdKnzncSekciaId);

            $trail->parent(
                'vzdelavanie.sprava.kniznica.kategoria.ucebnice.sekcia.index',
                $kategoria->id,
                $ucebnica->id,
            );

            foreach ($sekcia->ancestors()->orderBy('_lft')->get() as $ancestor) {
                $trail->push(
                    $ancestor->nazov,
                    route(
                        'vzdelavanie.sprava.kniznica.kategoria.ucebnice.sekcia.edit',
                        [$kategoria, $ucebnica, $ancestor],
                    ),
                );
            }

            $trail->push($sekcia->nazov);
        },
    );
} catch (DuplicateBreadcrumbException $e) {
    Log::error($e);
}
