<?php

namespace App\Form;

use App\Entity\Commune;
use App\Entity\Department;
use App\Entity\Arrondissement;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
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\Extension\Core\Type\TextareaType;
use Doctrine\ORM\Query\Expr;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;
use App\Repository\CommuneRepository;

class ArrondissementType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('department', EntityType::class, [
                'class' => Department::class,
                'mapped' => false,
                'choice_label' => 'name',
                'placeholder' => 'basics.department.placeholder',
                'label' => 'basics.department',
                'data' => $options['default_department'],
            ]);
        if ($options['default_department'] && $options['default_commune']) {
            $builder->add('commune', EntityType::class, [
                'class' => Commune::class, // Classe par défaut, ajustée dynamiquement
                'placeholder' => 'Sélectionnez une commune',
                'required' => false,
                'choice_label' => 'name', 
                'label' => 'Liste des Communes',
                'query_builder' => function(CommuneRepository $items) use($options){
                        return $items ->createQueryBuilder('c')
                                      ->where('c.department = :departement')
                                      ->setParameter('departement', $options['default_department'])
                                      ->orderBy('c.name', 'ASC');
                    },
                
            ]);
        }else{
            $builder->add('commune', EntityType::class, [
                'class' => Commune::class,
                'choice_label' => 'name',
                'placeholder' => 'Sélectionnez d\'abord un département',
                'label' => 'basics.commune',
                'choices' => []
            ]);

        }
            $builder->add('name', TextType::class, [
                'label' => 'basics.name',
                'empty_data' => '',
            ]);
            
            $builder->add('description', TextareaType::class, [
                'label' => 'Description',
                'required' => false,
                ])
        ;

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

    }

    private function addCommune(FormInterface $form,  Department $department)
    {
        $form->add('commune', EntityType::class, [
            'class' => Commune::class,
            'placeholder' => 'Sélectionnez une commune',
            'required' => true,
            'choice_label' => 'name', 
            'label' => 'Liste des Communes',
            'query_builder' => function(CommuneRepository $items)use($department){
                    return $items ->createQueryBuilder('c')
                                  ->where('c.department = :departement')
                                  ->setParameter('departement', $department)
                                  ->orderBy('c.name', 'ASC');
                },
            
        ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Arrondissement::class,
            'default_department' => null,
            'default_commune' => null 
        ));
    }
}
