<?php

namespace App\Form;

use App\Entity\Cible2063;
use App\Entity\Target;
use App\Entity\Goal;
use App\Entity\Indicator;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormInterface;
use App\Repository\TargetRepository;
use App\Repository\GoalRepository;
use App\Repository\IndicatorRepository;

class CibleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('code', TextType::class, [
                'label' => 'basics.code',
                'required' => true,
            ])
            ->add('name', TextType::class, [
                'label' => 'basics.name',
                'required' => true,
            ])
            ->add('aspiration', EntityType::class, [
                'label' => 'basics.aspiration',
                'class' => Goal::class,
                'query_builder' => function(GoalRepository $items) use($options) {
                    return $items ->createQueryBuilder('g')
                                  ->where('g.agenda = :agenda')
                                  ->setParameter('agenda', 2063)
                                  ->orderBy('g.code', 'ASC');
                },
                'attr' => [
                    'onchange' => 'this.form.submit()'
                ],
                'placeholder' => 'basics.aspiration.placeholder',
                'mapped' => false,
                'required' => false,
            ])
            ->add('objectif', EntityType::class, [
                'label' => 'basics.aspiration',
                'class' => Target::class,
                'attr' => [
                    'onchange' => 'this.form.submit()'
                ],
                'placeholder' => 'basics.objectif.placeholder',
                'mapped' => false,
                'required' => false,
            ])
            ;

            $builder->get('aspiration')->addEventListener(
                FormEvents::POST_SUBMIT,
                function (FormEvent $event) {
                    $form = $event->getForm();
                    $this->addObjectifField($form->getParent(), $form->getData());
                }
            );

    
            $builder->addEventListener(
                FormEvents::POST_SET_DATA,
                function (FormEvent $event) {
                    $form = $event->getForm();
    
                    $data = $event->getData();
                    
                    $objectif=null;
                    if($data->getDomaine()){    
                        global $kernel;
                        if('AppCache' == get_class($kernel)){
                            $kernel=$kernel->getKernel();
                        }
                        $doctrine=$kernel->getContainer()->get('doctrine');
                        $domaine=$doctrine->getRepository(Indicator::class)->find($data->getDomaine()->getId());
                        $objectif = $domaine ? $domaine->getTarget() : null;
                    }
                    if ($objectif) {
                        $aspiration = $objectif->getGoal();
                        $this->addObjectifField($form, $aspiration);
                        $form->get('aspiration')->setData($aspiration);
                    } else {
                        $this->addObjectifField($form, null);
                    }

                    $domaine = $data->getDomaine();
                    if ($domaine) {
                        $objectif = $domaine->getTarget();
                        $this->addDomaineField($form, $objectif);
                        $form->get('objectif')->setData($objectif);
                    } else {
                        $this->addDomaineField($form, null);
                    }
                }
            );
        }
        
        private function addDomaineField(FormInterface $form, ?Target $objectif)
        {
            $form->add('domaine', EntityType::class, [
                'label' => 'basics.domaine',
                'class' => Indicator::class,
                'placeholder' => 'basics.domaine.placeholder',
                'choices' => $objectif ? $objectif->getIndicators() : []
            ]);
        }

        private function addObjectifField(FormInterface $form, ?Goal $aspiration)
        {
            $builder = $form->getConfig()->getFormFactory()->createNamedBuilder(
                'objectif',
                EntityType::class,
                null,
                [
                    'label' => 'basics.objectif',
                    'class' => Target::class,
                    'placeholder' => 'basics.objectif.placeholder',
                    'attr' => [
                        'onchange' => 'this.form.submit()'
                    ],
                    'mapped' => false,
                    'required' => false,
                    'auto_initialize' => false,
                    'choices' => $aspiration ? $aspiration->getTargets() : []
                ]
            );

            $builder->addEventListener(
                FormEvents::POST_SUBMIT,
                function (FormEvent $event){
                    $form = $event->getForm();
                    $this->addDomaineField($form->getParent(), $form->getData());
                }
            );
    
            $form->add($builder->getForm());
        }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => Cible2063::class,
        ]);
    }
}
