<?php

namespace App\Service;

use App\Entity\Domain;
use App\Repository\Domain\DomainRepositoryInterface;
use App\Service\DataGrid\DataGridInterface;
use Doctrine\ORM\EntityNotFoundException;

final class DomainService
{
    /**
     * @var DomainRepositoryInterface
     */
    private $domainRepository;

    /**
     * DomainService constructor.
     *
     * @param DomainRepositoryInterface $domainRepository
     */
    public function __construct(DomainRepositoryInterface $domainRepository)
    {
        $this->domainRepository = $domainRepository;
    }

    /**
     * @param int $domainId
     *
     * @return Domain
     *
     * @throws EntityNotFoundException
     */
    public function getDomain(int $domainId): Domain
    {
        $domain = $this->domainRepository->findById($domainId);
        if (!$domain) {
            throw new EntityNotFoundException('Domain with id '.$domainId.' does not exist!');
        }

        return $domain;
    }

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

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

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

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

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

    /**
     * @param Domain $domain
     *
     * @return Domain
     */
    public function saveDomain(Domain $domain): Domain
    {
        $this->domainRepository->save($domain);

        return $domain;
    }

    /**
     * @param Domain $domain
     */
    public function deleteDomain(Domain $domain): void
    {
        $this->domainRepository->delete($domain);
    }

    public function getByUrl(String $url): Domain
    {
        $domain = $this->domainRepository->getByUrl($url);
        if (!$domain) {
            throw new EntityNotFoundException('Domain with url: '.$url.' does not exist!');
        }

        return $domain;
    }

    /**
     * @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('ip') && $dataGrid->getFilters()->get('ip')->isValid()) {
            $criteria += ['ip' => $dataGrid->getFilters()->get('ip')->getValue()];
        }

        return $criteria;
    }
}
