<?php 
 
namespace App\EventSubscriber; 
 
use ApiPlatform\Symfony\EventListener\EventPriorities; 
use App\Entity\Document; 
use App\Entity\Site; 
use App\Evaluation\EvaluationPrepare; 
use App\Repository\SiteRepository; 
use App\Services\SiteService; 
use App\Command\PropagateSiteAccessCommand; 
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpKernel\Event\RequestEvent; 
use Symfony\Component\HttpKernel\Event\ViewEvent; 
use Symfony\Component\HttpKernel\KernelEvents; 
use Symfony\Component\Security\Core\Security; 
use Psr\Log\LoggerInterface; 
 
final class SiteSubscriber implements EventSubscriberInterface 
{ 
    public function __construct( 
        private EvaluationPrepare $evaluationPrepare, 
        private Security $security, 
        private readonly ParameterBagInterface $parameterBag, 
        private SiteService $siteService, 
        private PropagateSiteAccessCommand $propagateSiteAccessCommand, 
        private SiteRepository $siteRepository 
    ) 
    { 
        $this->security = $security; 
    } 
 
    public static function getSubscribedEvents() 
    { 
        return [ 
            KernelEvents::VIEW => ['prepareSite', EventPriorities::POST_WRITE], 
        ]; 
    } 
 
    public function prepareSite(ViewEvent $event): void 
    { 
        $method = $event->getRequest()->getMethod(); 
        $site = $event->getControllerResult(); 
        if (!$site instanceof Site) { 
            return; 
        } 
         
        try { 
            if ($method === 'POST') { 
                $customer = $site->getCustomer()->getId(); 
                if ($customer === 355) { 
                $sitePath = $site->getPath(); 
                    if (isset($sitePath[2]) && $sitePath[2] === 'DIL') { 
                        $siteToProcess = $this->siteRepository->findOneByCode($sitePath[1]); 
                        $siteToProcessId = $siteToProcess ? $siteToProcess->getId() : null; 
                        $this->propagateSiteAccessCommand->propagate($siteToProcessId); 
                    } 
                    elseif (isset($sitePath[2]) && substr($sitePath[2], 0, 3) === 'GMR') { 
                        $parentSiteToProcess = $this->siteRepository->findOneByCode($sitePath[2]); 
                        $siteToProcess = $this->siteRepository->findOneByCode($sitePath[1]); 
                        $siteToProcessId = $siteToProcess ? $siteToProcess->getId() : null; 
                        $parentSiteToProcessId = $parentSiteToProcess ? $parentSiteToProcess->getId() : null; 
                        $this->propagateSiteAccessCommand->propagate($parentSiteToProcessId); 
                        $this->propagateSiteAccessCommand->propagate($siteToProcessId); 
                    } 
                } 
 
            } elseif ($method === 'PUT') { 
                $paramsArray  = json_decode($event->getRequest()->getContent(), true); 
                $docsIds = $paramsArray['docsIds'] ?? false; 
                $idUser = $paramsArray['idUser'] ?? false; 
                if($docsIds) { 
                    $this->siteService->siteAffectationDoc($site, $docsIds, $idUser); 
                } 
            } 
 
        } catch (\Throwable $throwable) { 
            header('Access-Control-Allow-Origin: *'); 
            dd($throwable->getMessage()); 
        } 
    } 
}