<?php

namespace App\Form;

use App\Entity\Ministry;
use App\Entity\Programm;
use App\Entity\Action;
use App\Entity\Commune;
use App\Repository\MinistryRepository;
use App\Repository\CommuneRepository;
use App\Repository\ProgrammRepository;
use App\Repository\ActionRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

class MinistrySelTypeCopy extends AbstractType
{
    private $year;
    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $this->year = $options['sessionYear']; 
        if($options['sessionMinistry']==null && $options['sessionCommune']==null){
            $builder->add('type', ChoiceType::class, [
                'choices' => [
                    'Ministère' => 'ministere',
                    'Commune' => 'commune',
                ],
                'placeholder' => 'Sélectionnez un type',
                'mapped' => false,
                'required' => false,
                'attr' => [
                    'onchange' => 'this.form.submit()'
                ],
                'label' => 'Type entité',
            ]);

            $builder->add('entite', EntityType::class, [
                'label' => 'Ministères/Communes',
                'class' => Ministry::class,
                'required' => false,
                'mapped' => false,
                'data' => null,
                'attr' => [
                        'onchange' => 'this.form.submit()'
                    ],
                'placeholder' => 'Sélectionnez d\'abord un type d\'entité',
                'choices' => [],
            ]);
            

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

            /*$builder->get('entite')->addEventListener(
                FormEvents::POST_SUBMIT,
                function (FormEvent $event) use($options) {
                    $form = $event->getForm()->getParent();
                    $data = $event->getData();
                    $type = $form->get('type')->getData();
                    if ($type === 'ministere') {
                        $this->addProgrammField($form, $data, null, $options);
                    } else if($type === 'commune') {
                        $this->addProgrammField($form, null, $data, $options);
                    }else{
                        $this->addProgrammField($form, null, null, $options);
                    }
                }
            );*/
        }

        $builder->addEventListener(
            FormEvents::POST_SET_DATA,
            function (FormEvent $event) use($options) {
                $form = $event->getForm();
                //$this->addProgrammField($form, null, null,$options);
                //$this->addActionField($form, null,$options);
            }
        );
    }

    private function addProgrammField(FormInterface $form, ?Ministry $ministry, ?Commune $commune, array $options)
    {
        $builder = $form->getConfig()->getFormFactory()->createNamedBuilder(
            'programm',
            EntityType::class,
            null,
            [
                'label' => 'basics.programm',
                'class' => Programm::class,
                'choice_label' => 'name',
                'placeholder' => ($ministry || $commune) ? 'basics.programm.placeholder' : 'Sélectionnez d\'abord un ministère ou une commune',
                'attr' => [
                    'onchange' => 'this.form.submit()'
                ],
                'mapped' => false,
                'required' => false,
                'auto_initialize' => false,
                'query_builder' => function (ProgrammRepository $repository) use($options, $ministry,$commune) {
                    return $repository->findProgrammByYear('%'.$options['sessionYear'].'%', $ministry,$commune);
                },
            ]
        );

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

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

    private function addActionField(FormInterface $form, ?Programm $programm, array $options)
    {
        $form->add('action', EntityType::class, [
            'label' => 'basics.action',
            'class'       => Action::class,
            'placeholder' => 'basics.action.placeholder',
            'attr' => [
                'onchange' => 'this.form.submit()'
            ],
            'mapped' => false,
            'required' => false,
            'query_builder' => function (ActionRepository $repository) use($programm, $options) {
                return $repository->createQueryBuilder('a')
                    ->orderBy('a.code', 'ASC')
                    ->andWhere('a.year = :year')
                    ->andWhere('a.programm = :programm')
                    ->andWhere('a.validated = :validated')
                    ->setParameter('year', $options['sessionYear'])
                    ->setParameter('programm', $programm ? $programm->getId() : null)
                    ->setParameter('validated', true)
                    ;
            },
        ]);
    }

    private function addEntiteField(FormInterface $form,  $type, $options)
    {
        if($type=='commune'){
            $builder = $form->getConfig()->getFormFactory()->createNamedBuilder(
                'entite',
                EntityType::class,
                null,
                [
                    'label' => 'Liste des communes',
                    'class' => Commune::class,
                    'choice_label' => 'name',
                    'placeholder' => 'Sélectionnez une commune',
                    'attr' => [
                        'onchange' => 'this.form.submit()'
                    ],
                    'mapped' => false,
                    'required' => false,
                    'auto_initialize' => false,
                    'query_builder' => function (CommuneRepository $er) {
                            return $er->createQueryBuilder('m')
                                    ->orderBy('m.name', 'ASC'); // Tri par nom en ordre croissant
                        },
                        
                ]
            );

            /*$builder->addEventListener(
                FormEvents::POST_SUBMIT,
                function (FormEvent $event) use($options) {
                    $form = $event->getForm();
                    $this->addProgrammField($form->getParent(), null, $form->getData(),$options);
                }
            );*/
        }else if($type=='ministere'){
            $builder = $form->getConfig()->getFormFactory()->createNamedBuilder(
                'entite',
                EntityType::class,
                null,
                [
                    'label' => 'Liste des ministères',
                    'class' => Ministry::class,
                    'choice_label' => 'name',
                    'placeholder' => 'Sélectionnez un ministère',
                    'attr' => [
                        'onchange' => 'this.form.submit()'
                    ],
                    'mapped' => false,
                    'required' => false,
                    'data' => null,
                    'auto_initialize' => false,
                    'query_builder' => function (MinistryRepository $er) {
                            return $er->createQueryBuilder('m')
                                    ->orderBy('m.name', 'ASC'); // Tri par nom en ordre croissant
                        },
                        
                ]
            );

            /*$builder->addEventListener(
                FormEvents::POST_SUBMIT,
                function (FormEvent $event) use($options) {
                    $form = $event->getForm();
                    $this->addProgrammField($form->getParent(), $form->getData(), null,$options);
                }
            );*/

        }else{
            $builder = $form->getConfig()->getFormFactory()->createNamedBuilder(
                'entite',
                EntityType::class,
                null,
                [
                    'label' => 'Minisètes/Commune',
                    'class' => Commune::class,
                    'choice_label' => 'name',
                    'placeholder' => 'Sélectionnez d\'abord un type d\'entité',
                    'attr' => [
                        'onchange' => 'this.form.submit()'
                    ],
                    'mapped' => false,
                    'required' => false,
                    'auto_initialize' => false,
                    'choices' => []
                        
                ]
            );
        }

       

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

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'sessionYear' => null,
            'sessionMinistry' => null,
            'sessionCommune' => null,
        ));
    }
}
