<?php
/**
 * Created by PhpStorm.
 * User: radko
 * Date: 15.11.18
 * Time: 11:23
 */

namespace Seka\Vzdelavanie\Services;

use Illuminate\Support\Collection;
use Seka\Vzdelavanie\Models\Kniznica\Kategoria;
use Seka\Vzdelavanie\Repositories\Contracts\UcebnicaRepositoryInterface;
use Seka\Vzdelavanie\Repositories\Contracts\KategoriaRepositoryInterface;
use Seka\Vzdelavanie\Repositories\Exceptions\ModelRelationshipsException;

/**
 * Class KategoriaService
 * @package Seka\Vzdelavanie\Services
 */
class KategoriaService extends Service implements KategoriaServiceInterface
{
    /**
     * @var \Seka\Vzdelavanie\Repositories\Contracts\KategoriaRepositoryInterface
     */
    protected $kategoriaRepository;

    /**
     * @var \Seka\Vzdelavanie\Repositories\Contracts\UcebnicaRepositoryInterface
     */
    protected $ucebnicaRepository;

    /**
     * KategoriaService constructor.
     * @param \Seka\Vzdelavanie\Repositories\Contracts\KategoriaRepositoryInterface $kategoriaRepository
     * @param \Seka\Vzdelavanie\Repositories\Contracts\UcebnicaRepositoryInterface  $ucebnicaRepository
     */
    public function __construct(
        KategoriaRepositoryInterface $kategoriaRepository,
        UcebnicaRepositoryInterface $ucebnicaRepository
    ) {
        $this->kategoriaRepository = $kategoriaRepository;
        $this->ucebnicaRepository = $ucebnicaRepository;
    }

    /**
     * @param int $id
     * @return mixed
     * @throws \Seka\Vzdelavanie\Repositories\Exceptions\ModelNotFoundException
     */
    public function vratPodlaId(int $id)
    {
        return $this->kategoriaRepository->query()->find($id);
    }

    /**
     * @param int      $id
     * @param int|null $pocet
     * @param bool     $verejne
     * @return \Seka\Vzdelavanie\Models\Kategoria
     * @throws \Seka\Vzdelavanie\Repositories\Exceptions\ModelNotFoundException
     */
    public function vratKategoriuSUcebnymiMaterialmi(int $id, int $pocet = null, bool $verejne = true): Kategoria
    {
        /** @var \Seka\Vzdelavanie\Models\Kniznica\Kategoria $kategoria */
        $kategoria = $this->kategoriaRepository->query()->find($id);
        $ucebnice = $this->ucebnicaRepository
            ->query()
            ->where('kategoria_id', $kategoria->id)
            ->where('verejne', $verejne)
            ->limit($pocet)
            ->get();
        $kategoria->ucebnice = $ucebnice;

        return $kategoria;
    }

    /**
     * @return \Illuminate\Support\Collection
     */
    public function vratVsetky(): Collection
    {
        return $this->kategoriaRepository->query()->get();
    }

    /**
     * @param int  $pocetUcebnychMaterialov
     * @param bool $verejne
     * @return \Illuminate\Support\Collection
     */
    public function vratVsetkySUcebnymiMaterialmi(int $pocetUcebnychMaterialov = 5, bool $verejne = true): Collection
    {
        return $this->kategoriaRepository
            ->query()
            ->allowedIncludes('ucebnice')
            ->withCount(['ucebnice as ucebnice_count' => function ($query) use ($verejne) {
                $query->where('verejne', $verejne);
            }])
            ->get()
            ->map(function ($query) use ($pocetUcebnychMaterialov, $verejne) {
                $query->setRelation('ucebnice', $query->ucebnice->where('verejne', $verejne)->take($pocetUcebnychMaterialov));

                return $query;
            });
    }

    /**
     * @param array $udaje
     */
    public function vytvorit(array $udaje): void
    {
        $this->kategoriaRepository->create($udaje);
    }

    /**
     * @param int   $id
     * @param array $udaje
     * @throws \Seka\Vzdelavanie\Repositories\Exceptions\ModelNotFoundException
     */
    public function upravit(int $id, array $udaje = []): void
    {
        $this->kategoriaRepository->update($udaje, $id);
    }

    /**
     * @param int $id
     * @throws \Seka\Vzdelavanie\Repositories\Exceptions\ModelRelationshipsException
     * @throws \Seka\Vzdelavanie\Repositories\Exceptions\ModelNotFoundException
     */
    public function odstranit(int $id): void
    {
        /** @var Kategoria $kategoria */
        $kategoria = $this->kategoriaRepository->query()->find($id);
        $ucebnicKategorie = $this->ucebnicaRepository->query()->findBy('kategoria_id', $kategoria->id, ['id']);

        if (!is_null($ucebnicKategorie) && $ucebnicKategorie->count() > 0) {
            throw new ModelRelationshipsException('Na kategóriu existujú previazané učebné materiály, nie je možné ju odstrániť.');
        }

        $this->kategoriaRepository->delete($kategoria->id);
    }
}
