<?php

namespace App\Form;

use App\Entity\Indicateur2063;
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 IndicateurType 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.id', '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,
        ])
        ->add('domaine', EntityType::class, [
            'label' => 'basics.domaine',
            'class' => Indicator::class,
            'attr' => [
                'onchange' => 'this.form.submit()'
            ],
            'placeholder' => 'basics.domaine.placeholder',
            'mapped' => false,
            'required' => false,
        ])

        ->add('goal', 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', 2030)
                              ->orderBy('g.id', 'ASC');
            },
            'attr' => [
                'onchange' => 'this.form.submit()'
            ],
            'placeholder' => 'basics.goal.placeholder',
            'mapped' => false,
            'required' => false,
        ])
        ->add('target', EntityType::class, [
            'label' => 'basics.target',
            'class' => Target::class,
            'attr' => [
                'onchange' => 'this.form.submit()'
            ],
            'placeholder' => 'basics.target.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->get('goal')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event) {
                $form = $event->getForm();
                $this->addTargetField($form->getParent(), $form->getData(), null);
            }
        );

        $builder->addEventListener(
            FormEvents::POST_SET_DATA,
            function (FormEvent $event) {
                $form = $event->getForm();

                $data = $event->getData();

                $objectif=null;
                $domaine=null;
                    if($data->getCible()){    
                        global $kernel;
                        if('AppCache' == get_class($kernel)){
                            $kernel=$kernel->getKernel();
                        }
                        $doctrine=$kernel->getContainer()->get('doctrine');
                        $cible=$doctrine->getRepository(Cible2063::class)->find($data->getCible()->getId());
                        $domaine=$cible ? $cible->getDomaine() : null;
                        $objectif = $domaine ? $domaine->getTarget() : null;
                    }

                if ($objectif) {
                    $aspiration = $objectif->getGoal();
                    $this->addObjectifField($form, $aspiration);
                    $form->get('aspiration')->setData($aspiration);
                } else {
                    $this->addObjectifField($form, null);
                }

                if ($domaine) {
                    $objectif = $domaine->getTarget();
                    $this->addDomaineField($form, $objectif);
                    $form->get('objectif')->setData($objectif);
                } else {
                    $this->addDomaineField($form, null);
                }

                $cible = $data->getCible();
                if ($cible) {
                    $domaine = $cible->getDomaine();
                    $this->addCibleField($form, $domaine);
                    $form->get('domaine')->setData($domaine);
                } else {
                    $this->addCibleField($form, null);
                }

                if($data->getIndicateur2030()){
                    global $kernel;
                    if('AppCache' == get_class($kernel)){
                        $kernel=$kernel->getKernel();
                    }
                    $doctrine=$kernel->getContainer()->get('doctrine');
                    $indicator=$doctrine->getRepository(Indicator::class)->find($data->getIndicateur2030()->getId());
                    //dd($indicator->getTarget()->getGoal());
                    $form->get('goal')->setData($indicator->getTarget()->getGoal());
                    $form->get('target')->setData($indicator->getTarget());

                    $this->addTargetField($form, $indicator->getTarget()->getGoal(), $indicator->getTarget());
                    $this->addIndicatorField($form, $indicator->getTarget());
                }else{
                    $this->addTargetField($form, null,null);
                    $this->addIndicatorField($form, null);
                }
                
            }
        );
    }

    private function addCibleField(FormInterface $form, ?Indicator $domaine)
    {
        $form->add('cible', EntityType::class, [
            'label' => 'basics.target',
            'class' => Cible2063::class,
            'placeholder' => 'basics.target.placeholder',
            'choices' => $domaine ? $domaine->getCibles() : []
        ]);
    }
    
    private function addDomaineField(FormInterface $form, ?Target $objectif)
    {
        $builder = $form->getConfig()->getFormFactory()->createNamedBuilder(
            'domaine',
            EntityType::class,
            null,
            [
                'label' => 'basics.domaine',
                'class' => Indicator::class,
                'placeholder' => 'basics.domaine.placeholder',
                'attr' => [
                    'onchange' => 'this.form.submit()'
                ],
                'mapped' => false,
                'required' => false,
                'auto_initialize' => false,
                'choices' => $objectif ? $objectif->getIndicators() : []
            ]
        );

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

        $form->add($builder->getForm());
    }

    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());
    }

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

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

        $form->add($builder->getForm());
    }

    private function addIndicatorField(FormInterface $form, ?Target $target)
    {
        $form->add('indicateur2030', EntityType::class, [
            'label' => 'basics.indicator',
            'class'       => Indicator::class,
            'placeholder' => 'basics.indicator.placeholder',
            'required' => false,
            'choices' => $target ? $target->getIndicators() : []
        ]);
    }

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