<?php
/**
 * Created by PhpStorm.
 * User: radko
 * Date: 31.7.18
 * Time: 16:35
 */

namespace Seka\Vzdelavanie\Services;

use Illuminate\Support\Collection;
use Seka\Vzdelavanie\Repositories\Exceptions\ModelNotFoundException;
use Seka\Vzdelavanie\Repositories\Contracts\SekciaRepositoryInterface;
use Seka\Vzdelavanie\Repositories\Contracts\UcebnicaRepositoryInterface;
use Seka\Vzdelavanie\Repositories\Exceptions\ModelRelationshipsException;

/**
 * Class SekciaService
 * @package Seka\Vzdelavanie\Services
 */
class SekciaService extends Service implements SekciaServiceInterface
{
    /**
     * @var \Seka\Vzdelavanie\Repositories\Contracts\UcebnicaRepositoryInterface
     */
    protected $ucebnyTextRepository;
    /**
     * @var \Seka\Vzdelavanie\Repositories\Contracts\SekciaRepositoryInterface
     */
    protected $sekciaUcebnehoTextuRepository;

    /**
     * SekciaService constructor.
     * @param \Seka\Vzdelavanie\Repositories\Contracts\UcebnicaRepositoryInterface   $ucebnyTextRepository
     * @param \Seka\Vzdelavanie\Repositories\Contracts\SekciaRepositoryInterface     $sekciaUcebnehoTextuRepository
     */
    public function __construct(
        UcebnicaRepositoryInterface $ucebnyTextRepository,
        SekciaRepositoryInterface $sekciaUcebnehoTextuRepository
    )
    {
        $this->ucebnyTextRepository = $ucebnyTextRepository;
        $this->sekciaUcebnehoTextuRepository = $sekciaUcebnehoTextuRepository;
    }

    /**
     * @param int      $ucebnyTextId
     * @param array    $udaje
     * @param int|null $rodicSekcieId
     * @return mixed
     * @throws \Seka\Vzdelavanie\Repositories\Exceptions\ModelNotFoundException
     */
    public function vytvoritSekciuUcebnehoTextu(int $ucebnyTextId, array $udaje, int $rodicSekcieId = null)
    {
        /* @var \Seka\Vzdelavanie\Models\Ucebnica $ucebnyText */
        if ($ucebnyText = $this->ucebnyTextRepository->query()->find($ucebnyTextId)) {
            /* @var \Seka\Vzdelavanie\Models\Sekcia $sekcia */
            $udaje['ucebnica_id'] = $ucebnyText->id;
            $udaje['parent_id'] = $rodicSekcieId;

            return $this->sekciaUcebnehoTextuRepository->create($udaje);
        }

        throw new ModelNotFoundException('Učebný text neexistuje.');
    }

    /**
     * @param int   $sekciaId
     * @param array $data
     * @return mixed
     * @throws \Seka\Vzdelavanie\Repositories\Exceptions\ModelNotFoundException
     */
    public function upravit(int $sekciaId, array $data = [])
    {
        return $this->sekciaUcebnehoTextuRepository->update($data, $sekciaId);
    }

    /**
     * @param int $id
     * @return mixed|\Seka\Vzdelavanie\Models\Sekcia
     */
    public function vratSekciu(int $id)
    {
        /* @var \Seka\Vzdelavanie\Models\Sekcia $sekcia */
        $sekcia = $this->sekciaUcebnehoTextuRepository->query()->find($id);

        return $sekcia;
    }

    /**
     * @param int  $id
     * @param bool $akoStrom
     * @param bool $request
     * @return \Illuminate\Support\Collection|\Kalnoy\Nestedset\Collection|mixed
     * @throws \Seka\Vzdelavanie\Repositories\Exceptions\ModelNotFoundException
     */
    public function vratZoznamSekciiUcebnehoTextu(int $id, bool $akoStrom = true, bool $request = false)
    {
        /* @var \Seka\Vzdelavanie\Models\Ucebnica $ucebnyText */
        if (!$ucebnyText = $this->ucebnyTextRepository->query()->find($id)) {
            throw new ModelNotFoundException('Učebný text neexistuje.');
        }

        if ($request) {
            /* @var \Kalnoy\Nestedset\Collection $zoznamSekcii */
            $zoznamSekcii = $this->sekciaUcebnehoTextuRepository
                ->query()
                ->addSelect('_lft', '_rgt', 'ucebnica_id', 'parent_id')
                ->where('ucebnica_id', $ucebnyText->getKey())
                ->allowedIncludes('ucebnica', 'parent')
                ->allowedFields('id', 'nazov', 'obsah')
                ->get();
        } else {
            /* @var \Kalnoy\Nestedset\Collection $zoznamSekcii */
            $zoznamSekcii = $this->sekciaUcebnehoTextuRepository
                ->query()
                ->where('ucebnica_id', $ucebnyText->getKey())
                ->get();
        }

        if ($zoznamSekcii->isEmpty()) {
            return collect([]);
        }

        if ($akoStrom) {
            return $zoznamSekcii->toTree();
        }

        return $zoznamSekcii->toFlatTree();
    }

    /**
     * @param int $ucebnyTextId
     * @param int $sekciaId
     * @throws \Seka\Vzdelavanie\Repositories\Exceptions\ModelRelationshipsException
     * @throws \Seka\Vzdelavanie\Repositories\Exceptions\ModelNotFoundException
     */
    public function odstranSekciu(int $ucebnyTextId, int $sekciaId)
    {
        /* @var \Seka\Vzdelavanie\Models\Sekcia $sekcia */
        $sekcia = $this->sekciaUcebnehoTextuRepository->find($sekciaId);

        if ((int) $sekcia->ucebnica_id !== (int) $ucebnyTextId) {
            throw new ModelRelationshipsException('Sekcia nepatrí pod daný učebný materiál.');
        }

        if ($sekcia->descendants->count()) {
            throw new ModelRelationshipsException('Na sekciu sa odkazujú iné vnorené sekcie.');
        }

        $this->sekciaUcebnehoTextuRepository->delete($sekciaId);
    }

    /**
     * @param string $text
     * @return \Illuminate\Support\Collection
     */
    public function vyhladaj(string $text): Collection
    {
        return $this->sekciaUcebnehoTextuRepository
            ->query()
            ->allowedIncludes('ucebnica.kategoria')
            ->where('nazov', 'like', sprintf('%%%s%%', $text))
            ->orWhere('obsah', 'like', sprintf('%%%s%%', $text))
            ->get();
    }
}
