<?php 
 
namespace App\EventSubscriber; 
 
use ApiPlatform\Symfony\EventListener\EventPriorities; 
use App\Entity\Compliance; 
use App\Entity\Document; 
use App\Entity\Section; 
use Doctrine\ORM\EntityManagerInterface; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpKernel\Event\ViewEvent; 
use Symfony\Component\HttpKernel\KernelEvents; 
use DateTimeImmutable; 
 
final class LastUpdateComplianceSubscriber implements EventSubscriberInterface 
{ 
    private EntityManagerInterface $entityManager; 
 
    public function __construct(EntityManagerInterface $entityManager,) 
    { 
        $this->entityManager = $entityManager; 
    } 
 
    public static function getSubscribedEvents() 
    { 
        return [ 
            KernelEvents::VIEW => ['lastUpdateCompliance', EventPriorities::POST_WRITE], 
        ]; 
    } 
 
    public function lastUpdateCompliance(ViewEvent $event): void 
    { 
        $event->getControllerResult() ? $entityInstance = $event->getControllerResult(): $entityInstance = $event->getRequest()->get('data'); 
        $method = $event->getRequest()->getMethod(); 
 
        if (($entityInstance instanceof Compliance) && (Request::METHOD_PUT === $method || Request::METHOD_POST === $method || Request::METHOD_DELETE === $method)) { 
            $section = $entityInstance->getSection(); 
            $this->updateSection($section); 
 
            $document = $section->getDocument(); 
            $this->updateDocument($document); 
 
        } else if (($entityInstance instanceof Section) && Request::METHOD_DELETE === $method) { 
            $document = $entityInstance->getDocument(); 
            $this->updateDocument($document); 
        } else { 
            return; 
        } 
    } 
 
    public function updateSection($section): void 
    { 
        $idSection = $section->getId(); 
        try { 
            $sql = "select  max(c.last_update_compliance) as last_update_compliance  from compliance c 
                            where  c.section_id = $idSection"; 
            $conn = $this->entityManager->getConnection(); 
            $stmt = $conn->prepare($sql); 
            $lastUpdateCompliance = $stmt->executeQuery(); 
            $lastUpdateCompliance = $lastUpdateCompliance->fetchAssociative(); 
            $lastUpdateCompliance = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $lastUpdateCompliance['last_update_compliance']); 
            $lastUpdateCompliance ? $section->setLastUpdateCompliance($lastUpdateCompliance): $section->setLastUpdateCompliance(null); 
            $this->entityManager->persist($section); 
            $this->entityManager->flush(); 
 
        } catch (\Throwable $e) { 
            header('Access-Control-Allow-Origin: *'); 
            dd($e->getMessage()); 
        } 
    } 
 
    public function updateDocument($document): void 
    { 
        $idDocument = $document->getId(); 
        $sql = "select  max(c.last_update_compliance) as last_update_compliance  from compliance c , section s 
                            where  c.section_id = s.id and s.document_id = $idDocument"; 
        $conn = $this->entityManager->getConnection(); 
        $stmt = $conn->prepare($sql); 
        $lastUpdateCompliance = $stmt->executeQuery(); 
        $lastUpdateCompliance = $lastUpdateCompliance->fetchAssociative(); 
        $lastUpdateCompliance = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $lastUpdateCompliance['last_update_compliance']); 
        $lastUpdateCompliance ? $document->setLastUpdateCompliance($lastUpdateCompliance): $document->setLastUpdateCompliance(null); 
        $this->entityManager->persist($document); 
        $this->entityManager->flush(); 
    } 
}