<?php
namespace App\Twig;
use App\Entity\Magasin;
use App\Entity\Ticket;
use App\Entity\Utilisateur;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Twig\Extension\AbstractExtension;
use Twig\Extension\GlobalsInterface;
class AppGlobals extends AbstractExtension implements GlobalsInterface
{
public function __construct(
private RequestStack $requestStack,
private EntityManagerInterface $em,
private TokenStorageInterface $tokenStorage
) {}
public function getGlobals(): array
{
$magasin = $this->resolveMagasin();
$utilisateur = $this->resolveUtilisateur();
$ticketCounts = $this->resolveTicketCounts($magasin, $utilisateur);
return [
'magasin' => $magasin,
'network' => (bool) ($magasin?->getNetwork() ?? false),
'ticket_counts' => $ticketCounts,
];
}
private function resolveMagasin(): ?Magasin
{
$request = $this->requestStack->getCurrentRequest();
if (!$request) {
return null; // e.g., CLI context
}
$session = $request->getSession();
$id = $session?->get('magasin');
if (!$id) {
return null;
}
return $this->em->getRepository(Magasin::class)->find($id);
}
private function resolveUtilisateur(): ?Utilisateur
{
$token = $this->tokenStorage->getToken();
$user = $token ? $token->getUser() : null;
if (!$user instanceof Utilisateur) {
return null;
}
return $user;
}
private function resolveTicketCounts(?Magasin $magasin, ?Utilisateur $utilisateur): array
{
if (!$magasin || !$utilisateur) {
return [
'open' => 0,
'mode' => null,
];
}
$repo = $this->em->getRepository(Ticket::class);
if ($utilisateur->getSuperAdmin()) {
return [
'open' => $repo->countOpenByMagasin($magasin),
'mode' => 'superadmin',
];
}
return [
'open' => $repo->countOpenByMagasinAndUser($magasin, $utilisateur),
'mode' => 'user',
];
}
}