<?php

declare(strict_types=1);

namespace App\Repository;

use App\Entity\User;
use DateTimeInterface;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;

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

    /**
     * @return User[]
     */
    public function findByRole(string $role): array
    {
        $conn = $this->getEntityManager()->getConnection();
        $sql  = 'SELECT id FROM "user" WHERE roles::text LIKE :role';
        $ids  = $conn->executeQuery($sql, ['role' => '%"'.$role.'"%'])->fetchFirstColumn();

        if ([] === $ids) {
            return [];
        }

        return $this->createQueryBuilder('u')
            ->where('u.id IN (:ids)')
            ->setParameter('ids', $ids)
            ->getQuery()
            ->getResult()
        ;
    }

    /**
     * Employees active on the given date (hired on/before it, not yet left).
     *
     * @return User[]
     */
    public function findActiveEmployees(DateTimeInterface $date): array
    {
        $dateStr = $date->format('Y-m-d');

        return $this->createQueryBuilder('u')
            ->where('u.isEmployee = true')
            ->andWhere('u.hireDate IS NULL OR u.hireDate <= :date')
            ->andWhere('u.endDate IS NULL OR u.endDate >= :date')
            ->setParameter('date', $dateStr)
            ->orderBy('u.username', 'ASC')
            ->getQuery()
            ->getResult()
        ;
    }
}
