<?php

namespace App\Form;

use App\Entity\Ministry;

use App\Repository\MinistryRepository;
use App\Repository\CommuneRepository;
use App\Entity\Commune;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\ORM\EntityRepository;

class MinistryCommuneType extends AbstractType
{
    private $year;
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $this->year = $options['sessionYear']; 

        if($options['sessionMinistry']==null && $options['sessionCommune']==null && $options['sessionDepartement']==null){
            // Champ `type` avec les options `Commune` et `Ministère`
            $builder->add('type', ChoiceType::class, [
                'choices' => [
                    'Ministère' => 'ministere',
                    'Commune' => 'commune',
                ],
                'attr' => [
                    'onchange' => 'this.form.submit()'
                ],
                'placeholder' => 'Sélectionnez une structure',
                'required' => true,
                'label' => 'Structure',
                'data' => $options['sessionType'],
            ]);
            

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

                }
            );

            $builder->addEventListener(
                FormEvents::PRE_SET_DATA,
                function (FormEvent $event) use ($options) {
                    $form = $event->getForm();
                    $data = $event->getData();
                    $type = $data ? $data->getType(): null;
    
                    $type=$options['sessionType'];
                    if ($type) {
                        $this->addEntiteField($form, $type, $options);
                        $form->get('entite')->setData(null);
                    } else {
                        $this->addEntiteField($form, null, $options);
                    }
                }
            );
        }

        if($options['sessionDepartement']){
            $builder->add('entite', EntityType::class, [
                'class' => Commune::class, // Classe par défaut, ajustée dynamiquement
                'placeholder' => 'Sélectionnez une commune',
                'required' => false,
                'mapped' => false,
                'attr' => [
                    'onchange' => 'this.form.submit()'
                ],
                'choice_label' => 'name', 
                'label' => 'Communes',
                'query_builder' => function (CommuneRepository $er) use($options) {
                    return $er->createQueryBuilder('m')
                            ->where('m.department = :departement') 
                            ->setParameter('departement', $options['sessionDepartement'])
                            ->orderBy('m.name', 'ASC'); // Tri par nom en ordre croissant
                },
                
            ]);
        }        

        

    }

    private function addEntiteField(FormInterface $form,  $type, $options)
    {
        if($type){
            if($type=='commune'){
                $form->add('entite', EntityType::class, [
                    'class' => Commune::class, // Classe par défaut, ajustée dynamiquement
                    'placeholder' => 'Sélectionnez une commune',
                    'attr' => [
                        'onchange' => 'this.form.submit()'
                    ],
                    'required' => false,
                    'choice_label' => 'name', 
                    'data' => $options['sessionEntite'],
                    'label' => 'Communes',
                    'error_bubbling' => true,
                    'query_builder' => function (CommuneRepository $er) {
                        return $er->createQueryBuilder('m')
                                ->orderBy('m.name', 'ASC'); // Tri par nom en ordre croissant
                    },
                    
                ]);
            }else if($type=='ministere'){
                $form->add('entite', EntityType::class, [
                    'class' => Ministry::class, // Classe par défaut, ajustée dynamiquement
                    'placeholder' => 'Sélectionnez un ministère',
                    'attr' => [
                        'onchange' => 'this.form.submit()'
                    ],
                    'required' => false,
                    'data' => $options['sessionEntite'],
                    'choice_label' => 'name', 
                    'label' => 'Ministères',
                    'error_bubbling' => true,
                    'query_builder' => function(MinistryRepository $repository)  {
                        return $repository->findMinistryByYear(
                            '%'.$this->year.'%', null
                        );
                    },
                ]);
            }
        }else{
            $form->add('entite', EntityType::class, [
                'label' => 'Ministères/Communes',
                'class' => Ministry::class,
                'required' => false,
                'data' => null,
                'error_bubbling' => true,
                'placeholder' => 'Sélectionnez d\'abord une structure',
                'choices' => [],
            ]);
        }
    }
       

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