<?php

namespace App\Form;

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

class ProgrammType extends AbstractType
{
    private $year;
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $this->year = $options['sessionYear']; 
        
        $builder
            ->add('code', TextType::class, [
                'label' => 'basics.code',
                'empty_data' => '',
                'required' => true,
                ])
            ->add('name', TextType::class, [
                'label' => 'basics.name',
                'empty_data' => '',
                'required' => true,
            ]);
        if($options['sessionMinistry']==null && $options['sessionCommune']==null && $options['sessionDepartement']==null){
            $builder->add('type', ChoiceType::class, [
                    'choices' => [
                        'Ministère' => 'ministere',
                        'Commune' => 'commune',
                    ],
                    'placeholder' => 'Sélectionnez une structure',
                    'required' => true,
                    'mapped' => false,
                    'disabled' => $options['default_type'] ? true : false,
                    'label' => 'Structure',
                    'data' => $options['default_type']
                ]);

                if ($options['default_type'] && $options['default_entity']) {
                    if($options['default_type'] == 'commune') {
                        $builder->add('entite', EntityType::class, [
                            'class' => Commune::class,
                            'placeholder' => 'Sélectionnez une commune',
                            'required' => true,
                            'mapped' => false,
                            'choice_label' => 'name',
                            'label' => 'Communes',
                            'query_builder' => function (CommuneRepository $er) {
                                return $er->createQueryBuilder('m')
                                        ->orderBy('m.name', 'ASC');
                            },
                            'data' => $options['default_entity']
                        ]);
                    } else if($options['default_type'] == 'ministere') {
                        $builder->add('entite', EntityType::class, [
                            'class' => Ministry::class,
                            'placeholder' => 'Sélectionnez un ministère',
                            'required' => true,
                            'mapped' => false,
                            'choice_label' => 'name',
                            'label' => 'Ministères',
                            'query_builder' => function(MinistryRepository $repository) {
                                return $repository->findMinistryByYear(
                                    '%'.$this->year.'%', null
                                );
                            },
                            'data' => $options['default_entity']
                        ]);
                    }
                }else {
                    $builder->add('entite', EntityType::class, [
                        'label' => 'Ministères/Communes',
                        'class' => Ministry::class,
                        'required' => true,
                        'mapped' => false,
                        'placeholder' => 'Sélectionnez d\'abord une structure',
                        'choices' => [],
                    ]);
                }


                $builder->get('type')->addEventListener(
                    FormEvents::POST_SUBMIT,
                    function (FormEvent $event) {
                        $form = $event->getForm();
                        $this->addEntiteField($form->getParent(), $form->getData());
                    }
                );
        }
        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,
                '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
                },
                
            ]);

        }
            $builder->add('uploadkey', TextType::class, [
                'label' => 'basics.uploadkey',
                'disabled' => true,
                'mapped' => false,
                'data' => $options['uploadkey'],
                ])
            ;

        

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) use ($options) {

                $form = $event->getForm();
                $programm = $event->getData();

                if (!empty($options['editable_years'])) {
                    $data = array_filter($programm->getYears(), function ($year) use ($options) {
                        return in_array($year, $options['editable_years']);
                    });
                    $choices = array_combine($options['editable_years'], $options['editable_years']);
                    $event->getForm()->add('years', ChoiceType::class, [
                        'label' => 'form.programm.years.label',
                        // Use mapped = false for security reasons
                        'mapped' => false,
                        'choices' => $choices,
                        'choice_label' => function ($value, $key, $index) {
                            return $key;
                        },
                        'expanded' => true,
                        'multiple' => true,
                        'data' => $data
                    ]);
                }else{
                    $choices = array_combine($options['editable_years'], $options['editable_years']);
                    $event->getForm()->add('years', ChoiceType::class, [
                        'label' => 'form.direction.years.label',
                        // Use mapped = false for security reasons
                        'mapped' => false,
                        'choices' => $choices,
                        'choice_label' => function ($value, $key, $index) {
                            return $key;
                        },
                        'expanded' => true,
                        'multiple' => true,
                    ]);
                }
            }
        ); 
    }

    private function addEntiteField(FormInterface $form,  $type, $defaultEntite = null)
    {
        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',
                    'required' => true,
                    'mapped' => false,
                    'choice_label' => 'name', 
                    'label' => 'Communes',
                    'data' => $defaultEntite,
                    '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',
                    'required' => true,
                    'mapped' => false,
                    'choice_label' => 'name', 
                    'label' => 'Ministères',
                    'data' => $defaultEntite,
                    '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' => true,
                'mapped' => false,
                'placeholder' => 'Sélectionnez d\'abord une structure',
                'choices' => [],
            ]);
        }
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Programm::class,
            'sessionYear' => null,
            'sessionMinistry' => null,
            'sessionCommune' => null,
            'sessionDepartement' => null,
            'editable_years' => [],
            'uploadkey' => null,
            'default_type' => null,
            'default_entity' => null 

        ));
    }
}
