<?php

namespace App\Resource\Repository;

use App\Resource\Entity\ClinicResource;
use App\Resource\Entity\ResourceException;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;

/**
 * @extends ServiceEntityRepository<ResourceException>
 */
class ResourceExceptionRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, ResourceException::class);
    }

    public function findByUuid(string $uuid): ?ResourceException
    {
        return $this->findOneBy(['uuid' => $uuid]);
    }

    /**
     * استثناهایی که با بازهٔ [from, to) **تداخل** دارند — نه فقط آن‌هایی که کاملاً
     * درونش‌اند. مرخصیِ سه‌روزه‌ای که وسطش این بازه است باید برگردد.
     *
     * @return ResourceException[]
     */
    public function findOverlapping(ClinicResource $resource, int $from, int $to): array
    {
        return $this->createQueryBuilder('e')
            ->where('e.resource = :resource')
            ->andWhere('e.startsAt < :to')
            ->andWhere('e.endsAt > :from')
            ->setParameter('resource', $resource)
            ->setParameter('from', $from)
            ->setParameter('to', $to)
            ->orderBy('e.startsAt', 'ASC')
            ->getQuery()
            ->getResult();
    }

    /**
     * استثناهای چند منبع با یک کوئری.
     *
     * @param int[] $resourceIds
     * @return array<int, list<\App\Resource\Entity\ResourceException>>
     */
    public function findOverlappingForResources(array $resourceIds, int $from, int $to): array
    {
        if ($resourceIds === []) {
            return [];
        }

        $rows = $this->createQueryBuilder('e')
            ->where('IDENTITY(e.resource) IN (:ids)')
            ->andWhere('e.startsAt < :to')
            ->andWhere('e.endsAt > :from')
            ->setParameter('ids', $resourceIds)
            ->setParameter('from', $from)
            ->setParameter('to', $to)
            ->orderBy('e.startsAt', 'ASC')
            ->getQuery()
            ->getResult();

        $byResource = [];
        foreach ($rows as $row) {
            $byResource[(int) $row->getResource()->getId()][] = $row;
        }

        return $byResource;
    }
}
