<?php

namespace App\Form;

use App\Entity\Activity;
use App\Repository\GoalRepository;
use App\Entity\Arrondissement;
use App\Repository\ArrondissementRepository;
use App\Entity\Goal;
use App\Entity\Target;
use App\Entity\Indicator;
use App\Entity\Nature;
use App\Entity\Commune;
use App\Entity\Poste;
use App\Entity\Notation;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\PercentType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class NotationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $grouping = $options['grouping'];
        $commune = $options['commune'];

        if($grouping=='arrondissement'){
            $locationChoices['Arrondissement(s)']  = 'arrondissement';
        }else{
            $locationChoices['basics.department'] = 'department';
            if ($options['enabledPoste']) {
                $locationChoices['basics.poste']  = 'poste';
            }
        }

        $builder
            ->add('treated', CheckboxType::class, [
                'label' => false,
                'mapped' => false,
                'required' => false,
            ])
            ->add('nature', EntityType::class, [
                'class' => Nature::class,
                'choice_label' => 'name',
                'label' => false,
                'placeholder' => 'Choisir une nature',
            ])
            ->add('goal', EntityType::class, [
                'class' => Goal::class,
                'query_builder' => function(GoalRepository $items) {
                    return $items ->createQueryBuilder('g')
                                  ->where('g.agenda = :agenda')
                                  ->setParameter('agenda', 2030)
                                  ->orderBy('g.code', 'ASC');
                },
                'label' => false,
                'placeholder' => 'Sélectionnez un ODD',
                'mapped' => false,
            ])
            ->add('locationType', ChoiceType::class, [
                'choices' => $locationChoices,
                'label' => false,
                'mapped' => false,
            ]);
            
            if($grouping=='arrondissement'){
                $builder->add('arrondissements', EntityType::class, [
                    'class' => Arrondissement::class,
                    'query_builder' => function(ArrondissementRepository $items) use($commune) {
                    return $items ->createQueryBuilder('a')
                                  ->where('a.commune = :commune')
                                  ->setParameter('commune', $commune)
                                  ->orderBy('a.name', 'ASC');
                    },
                    'label' => false,
                    'placeholder' => '',
                    'multiple' => true,
                ]);
            }else{
                $builder->add('communes', EntityType::class, [
                    'class' => Commune::class,
                    'label' => false,
                    'placeholder' => '',
                    'multiple' => true,
                    'group_by' => function (Commune $commune) use ($grouping) {
                        if ($grouping=='pole') {
                            return $commune->getPole()->getName();
                        } elseif ($grouping=='zone') {
                            return $commune->getZone()->getName();
                        } else {
                            return $commune->getDepartment()->getName();
                        }
                    },
                ])
                ->add('postes', EntityType::class, [
                    'class' => Poste::class,
                    'label' => false,
                    'placeholder' => '',
                    'multiple' => true,
                    'group_by' => function (Poste $poste) {
                        return $poste->getTypePoste();
                    },
                ]);
            }
            $builder->add('targetRate', HiddenType::class, [
                'label' => false,
                'empty_data' => 0.00,
            ])
            ->add('locationRate', HiddenType::class, [
                'label' => false,
                'empty_data' => 0.00,
            ])
            ->add('sensHtml', PercentType::class, [
                'label' => false,
                'scale' => 2,
                'type' => 'integer',
                'attr' => [
                    'class' => 'text-right',
                ],
                'required' => true,
                'disabled' => true,
                'symbol' => false,
                'empty_data' => 0.00,
                'mapped' => false,
            ])
            ->add('sensitivity', HiddenType::class, [
                'label' => false,
                'empty_data' => 0.00,
            ])
            ->add('maxRate', HiddenType::class, [
                'mapped' => false,
                'data' => $options['maxRate'],
            ])
            ->add('minRate', HiddenType::class, [
                'mapped' => false,
                'data' => $options['minRate'],
                ])
            ->add('allRate', HiddenType::class, [
                'mapped' => false,
                'data' => $options['allRate'],
                ])
            ->add('weighting', HiddenType::class, [
                'mapped' => false,
                'data' => $options['weighting'],
                ])
        ;

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

                $target = $data->getTarget();
                if ($target) {
                    $goal = $target->getGoal();
                    $form->get('goal')->setData($goal);
                    $this->addTargetField($form, $goal);
                    $this->addIndicatorField($form, $target);
                } else {
                    $this->addTargetField($form, null);
                    $this->addIndicatorField($form, null);
                }

            }
        );
    }

    private function addTargetField(FormInterface $form, ?Goal $goal)
    {
        $builder = $form->getConfig()->getFormFactory()->createNamedBuilder(
            'target',
            EntityType::class,
            null,
            [
                'class' => Target::class,
                'label' => false,
                'placeholder' => 'Sélectionnez une cible',
                //'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('indicators', EntityType::class, [
            'class' => Indicator::class,
            'label' => false,
            'placeholder' => '',
            'required' => false,
            'multiple' => true,
            'choices' => $target ? $target->getIndicators() : []
        ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Notation::class,
            'enabledPoste' => false,
            'grouping' => null,
            'commune' => null,
            'minRate' => 0,
            'maxRate' => 0,
            'allRate' => [],
            'weighting' => 100,
        ));
    }
}
