<?php

namespace App\Service\Content;

use App\Entity\Content\Status;
use App\Entity\Content\Workflow;
use App\Service\DataGrid\DataGridInterface;
use Doctrine\ORM\EntityNotFoundException;

final class StatusService
{
    /**
     * @var StatusRepositoryInterface
     */
    private $statusRepository;

    /**
     * StatusService constructor.
     *
     * @param StatusRepositoryInterface $statusRepository
     */
    public function __construct(StatusRepositoryInterface $statusRepository)
    {
        $this->statusRepository = $statusRepository;
    }

    /**
     * @param int $statusId
     *
     * @return Status
     *
     * @throws EntityNotFoundException
     */
    public function get(int $statusId): Status
    {
        $status = $this->statusRepository->findById($statusId);
        if (!$status) {
            throw new EntityNotFoundException('Content Status with id '.$statusId.' does not exist!');
        }

        return $status;
    }

    /**
     * @return array|null
     */
    public function getAll(): ?array
    {
        return $this->statusRepository->findAll();
    }

    /**
     * @return array|null
     */
    public function getByGrid(DataGridInterface $dataGrid): ?array
    {
        $criteria = $this->getCriteria($dataGrid);

        return $this->statusRepository->findBy(
            $criteria,
            [
                $dataGrid->getSorters()->first()->getSort() => $dataGrid->getSorters()->first()->getOrder(),
            ],
            $dataGrid->getNavigation()->getRpp(),
            $dataGrid->getNavigation()->getRpp() * $dataGrid->getNavigation()->getPage());
    }

    /**
     * @param DataGridInterface $dataGrid
     *
     * @return array
     */
    private function getCriteria(DataGridInterface $dataGrid): array
    {
        $criteria = [];
        if ($dataGrid->getFilters()->containsKey('q') && $dataGrid->getFilters()->get('q')->isValid()) {
            $criteria += ['q' => $dataGrid->getFilters()->get('q')->getValue()];
        }

        if ($dataGrid->getFilters()->containsKey('workflow') && $dataGrid->getFilters()->get('workflow')->isValid()) {
            $criteria += ['workflow' => $dataGrid->getFilters()->get('workflow')->getValue()];
        }

        return $criteria;
    }

    /**
     * @param DataGridInterface $dataGrid
     *
     * @return int
     */
    public function countByGrid(DataGridInterface $dataGrid): int
    {
        $criteria = $this->getCriteria($dataGrid);

        return $this->statusRepository->count($criteria);
    }

    /**
     * @param Status $status
     *
     * @return Status
     */
    public function save(Status $status): Status
    {
        $this->statusRepository->save($status);

        return $status;
    }

    /**
     * @param Status $status
     */
    public function delete(Status $status): void
    {
        $this->statusRepository->delete($status);
    }

    public function getFirstByWorkflow(Workflow $workflow)
    {
        return $this->statusRepository->findOneBy(['workflow' => $workflow], ['orderLvl' => 'asc']);
    }
}
