<?php

declare(strict_types=1);

namespace Seka\Vzdelavanie\Services\Kniznica;

use Illuminate\Support\Collection;
use Seka\Vzdelavanie\Models\Kniznica\Sekcia;
use Seka\Vzdelavanie\Models\Kniznica\Ucebnica;
use Seka\Vzdelavanie\Dtos\Kniznica\NavigaciaDTO;

/**
 * Class NavigaciaSekciamiUcebnehoMaterialuFactory
 *
 * @package Seka\Vzdelavanie\Services\Kniznica
 */
final class NavigaciaSekciamiUcebnehoMaterialuFactory
{
    /**
     * @param \Illuminate\Support\Collection                $sekcie
     * @param \Seka\Vzdelavanie\Models\Kniznica\Sekcia|null $aktivnaSekcia
     * @param \Seka\Vzdelavanie\Models\Kniznica\Ucebnica    $ucebnyMaterial
     * @param string                                        $nazovCesty
     *
     * @return \Seka\Vzdelavanie\Dtos\Kniznica\NavigaciaDTO
     */
    public static function navigacia(
        Collection $sekcie,
        ?Sekcia $aktivnaSekcia,
        Ucebnica $ucebnyMaterial,
        string $nazovCesty
    ): NavigaciaDTO {
        $index = 0;
        $rodicSekcie = null;

        if ($aktivnaSekcia instanceof Sekcia) {
            $index = $sekcie->search(function ($itm, $k) use ($aktivnaSekcia) {
                return $itm->getKey() === $aktivnaSekcia->getKey();
            });
            $rodicSekcie = $aktivnaSekcia->parent;
        }

        if ($sekcie->count() && ($index < $sekcie->count())) {
            $prev = $index > 0 ? $index - 1 : null;
            $next = $index < ($sekcie->count() - 1) ? $index + 1 : null;
        }

        return
            new NavigaciaDTO([
                'predchadzajuca' => [
                    'nazov' => $prev ? $sekcie[$prev]->nazov : null,
                    'link' => $prev ? self::vytvorCestu($sekcie[$prev], $ucebnyMaterial, $nazovCesty) : null,
                ],
                'rodic' => [
                    'nazov' => $rodicSekcie ? $rodicSekcie->nazov : null,
                    'link' => $rodicSekcie ? self::vytvorCestu($rodicSekcie, $ucebnyMaterial, $nazovCesty) : null,
                ],
                'nasledujuca' => [
                    'nazov' => $next ? $sekcie[$next]->nazov : null,
                    'link' => $next ? self::vytvorCestu($sekcie[$next], $ucebnyMaterial, $nazovCesty) : null,
                ],
            ]);
    }

    /**
     * @param \Seka\Vzdelavanie\Models\Kniznica\Sekcia   $sekcia
     * @param \Seka\Vzdelavanie\Models\Kniznica\Ucebnica $ucebnyMaterial
     * @param string                                     $nazovCesty
     *
     * @return string
     */
    private static function vytvorCestu(Sekcia $sekcia, Ucebnica $ucebnyMaterial, string $nazovCesty)
    {
        return route(
            $nazovCesty,
            [
                $ucebnyMaterial,
                $sekcia,
            ]
        );
    }
}
