<?php

namespace App\Repository;

use App\Entity\AuditLog;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Security\Core\User\UserInterface;

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

    /**
     * Récupère les logs en excluant les comptes ROLE_ROOT
     */
// src/Repository/AuditLogRepository.php



    public function findAllForUser(?UserInterface $user): array
    {
        $qb = $this->createQueryBuilder('l')
            ->innerJoin('l.account', 'a')
            ->orderBy('l.actionAt', 'DESC')
            ->setMaxResults(100);

        // Si l'utilisateur n'est pas ROOT, on cache les actions des ROOT
        if (!$user || !in_array('ROLE_ROOT', $user->getRoles())) {
            // Astuce PostgreSQL pour DQL : on utilise une expression de comparaison
            // qui force la lecture en texte sans utiliser le mot-clé CAST qui plante
            $qb->andWhere('a.roles NOT LIKE :role')
                ->setParameter('role', '%ROLE_ROOT%');
        }

        return $qb->getQuery()->getResult();
    }

    // src/Repository/AuditLogRepository.php

    /**
     * Récupère la requête des logs en appliquant les restrictions de sécurité
     * et le filtrage optionnel par compte.
     */
    public function getQueryForUser(?UserInterface $user, ?int $filterAccount = null): \Doctrine\ORM\Query
    {
        $qb = $this->createQueryBuilder('l')
            ->innerJoin('l.account', 'a')
            ->addSelect('a') // Optimisation pour éviter les requêtes N+1
            ->orderBy('l.actionAt', 'DESC');

        // 1. SÉCURITÉ : Si l'utilisateur n'est pas ROOT, on cache les logs des ROOT
        if (!$user || !in_array('ROLE_ROOT', $user->getRoles())) {
            $qb->andWhere('a.roles NOT LIKE :role')
                ->setParameter('role', '%ROLE_ROOT%');
        }

        // 2. FILTRAGE : Si un compte spécifique est sélectionné dans le filtre
        if ($filterAccount) {
            $qb->andWhere('a.id = :filterId')
                ->setParameter('filterId', $filterAccount);
        }

        return $qb->getQuery();
    }
}
