<?php

declare(strict_types=1);

namespace Seka\Vzdelavanie\Services\Kniznica;

use Illuminate\Support\Collection;
use Seka\Vzdelavanie\Models\Kniznica\Sekcia;
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 $aktivnaSekcia
     * @param int                                      $ucebnyMaterialId
     * @param string                                   $nazovCesty
     *
     * @return \Seka\Vzdelavanie\Dtos\Kniznica\NavigaciaDTO
     */
    public static function navigacia(
        Collection $sekcie,
        Sekcia $aktivnaSekcia,
        int $ucebnyMaterialId,
        string $nazovCesty
    ): NavigaciaDTO {
        $index = $sekcie->search($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;
        }

        $vytvorCestu = function (int $sekciaId, int $ucebnyMaterialId, string $nazovCesty) {
            return route($nazovCesty, ['id' => $ucebnyMaterialId, 'sekciaId' => $sekciaId]);
        };

        return
            new NavigaciaDTO([
                'predchadzajucaUrl' => $prev ? $vytvorCestu($sekcie[$prev], $ucebnyMaterialId, $nazovCesty) : null,
                'rodicUrl' => $rodicSekcie ? $vytvorCestu($rodicSekcie->getKey(), $ucebnyMaterialId, $nazovCesty) : null,
                'nasledujucaUrl' => $next ? $vytvorCestu($sekcie[$next], $ucebnyMaterialId, $nazovCesty) : null,
            ]);
    }
}
