<?php

namespace Lc\SovBundle\EventSubscriber\Translation;

use Doctrine\ORM\PersistentCollection;
use Doctrine\ORM\Query;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterCrudActionEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeCrudActionEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityPersistedEvent;
use Gedmo\Translatable\TranslatableListener;
use Lc\SovBundle\Doctrine\Extension\TranslatableInterface;
use Lc\SovBundle\Doctrine\EntityManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use function Symfony\Component\Translation\t;

class   TranslationEasyAdminSubscriber implements EventSubscriberInterface
{
        protected $em;

        public function __construct(EntityManager $entityManager)
        {
                $this->em = $entityManager;
        }

        public static function getSubscribedEvents()
        {
                return [
                        BeforeCrudActionEvent::class => ['setTranslatableLocale']
                ];
        }

        public function setTranslatableLocale(BeforeCrudActionEvent $event)
        {

                $entity = $event->getAdminContext()->getEntity()->getInstance();
                $_locale = $event->getAdminContext()->getRequest()->get('_locale');

                if($entity instanceof TranslatableInterface){

                        //parcours les champs association pour détecter un champ de association qui est traduisible
                        foreach ($this->em->getClassMetadata(get_class($entity))->getAssociationMappings() as $associationMapping){
                                if (in_array(TranslatableInterface::class, class_implements($associationMapping["targetEntity"]))){
                                        if($entity->__get($associationMapping['fieldName']) instanceof PersistentCollection){
                                                foreach ($entity->__get($associationMapping['fieldName']) as $item){
                                                        $item->setTranslatableLocale($_locale);
                                                        $this->em->refresh($item);
                                                }
                                        }else{
                                                if($entity->__get($associationMapping['fieldName'])) {
                                                        $entity->__get($associationMapping['fieldName'])->setTranslatableLocale($_locale);
                                                        $this->em->refresh($entity->__get($associationMapping['fieldName']));
                                                }
                                        }

                                }
                        }
                        $entity->setTranslatableLocale($_locale);
                        $this->em->refresh($entity);
                }
        }


}