<?php

namespace App\Representation\Repository;

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

class RepresentationRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Representation::class);
    }

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

    public function findByUser(User $user): ?Representation
    {
        return $this->findOneBy(['user' => $user]);
    }

    public function findActiveByDomain(string $domain): ?Representation
    {
        return $this->findOneBy(['domain' => $domain, 'active' => true]);
    }

    /**
     * تطبیق بر اساس اولین label دامنه (TLD-agnostic) — هم‌راستا با تطبیق subdomainِ
     * شهرها؛ لازم برای dev (مثلاً host=`x-nobat.localhost` باید نماینده‌ی `x-nobat.ir`
     * را پیدا کند). فقط وقتی نتیجه یکتاست برمی‌گرداند تا از ابهام (چند TLD روی یک
     * prefix) جلوگیری شود.
     */
    public function findActiveByDomainPrefix(string $prefix): ?Representation
    {
        if ($prefix === '') {
            return null;
        }

        $rows = $this->createQueryBuilder('r')
            ->where('r.active = true')
            ->andWhere('r.domain LIKE :p')
            ->setParameter('p', $prefix . '.%')
            ->setMaxResults(2)
            ->getQuery()
            ->getResult();

        return count($rows) === 1 ? $rows[0] : null;
    }

    public function save(Representation $entity, bool $flush = true): void
    {
        $this->getEntityManager()->persist($entity);
        if ($flush) $this->getEntityManager()->flush();
    }

    public function remove(Representation $entity, bool $flush = true): void
    {
        $this->getEntityManager()->remove($entity);
        if ($flush) $this->getEntityManager()->flush();
    }
}
