<?php

namespace App\Form;

use App\Entity\Desagregation;
use App\Entity\Goal;
use App\Entity\Target;
use App\Entity\Indicator;
use App\Entity\Ministry;
use App\Repository\MinistryRepository;
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 App\Repository\GoalRepository;
use App\Repository\DesagregationRepository;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use App\Utils\YearsUtils;
use App\Repository\TargetRepository;

class IndicatorType extends AbstractType
{
    
    private $params;
    private $years;
    private $communal;
    private $agenda;
    private $sessionYear;
    private $sessionMinistry;

    public function __construct(ParameterBagInterface $params)
    {
        $startYear = $params->get('suiodd_year');
        $this->years = YearsUtils::choicesYears($startYear);
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $this->agenda=($options['agenda']);
        $this->sessionYear=($options['sessionYear']);
        $this->sessionMinistry=($options['sessionMinistry']);

        if($this->agenda==2063){
            $label = 'basics.aspiration';
            $placeholder = 'basics.aspiration.placeholder'; 
        }else{
            $label = 'basics.goal';
            $placeholder = 'basics.goal.placeholder'; 
        }
        
        $this->communal = $options['communal'];
        $builder
            ->add('code', TextType::class, [
                'label' => 'basics.code'
            ])
            ->add('name', TextType::class, [
                'label' => 'basics.name'
            ])
            ->add('goal', EntityType::class, [
                'label' => $label,
                'class' => Goal::class,
                'query_builder' => function(GoalRepository $items) use($options) {
                    return $items ->createQueryBuilder('g')
                                  ->where('g.agenda = :agenda')
                                  ->setParameter('agenda', $options['agenda'])
                                  ->orderBy('g.code', 'ASC');
                },
                'placeholder' => $placeholder,
                'mapped' => false,
                'required' => false,
                'data' => $options['goal'],
            ])
        ;

        $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();
                    $this->addTargetField($form, $goal);
                    $form->get('goal')->setData($goal);
                } else {
                    $this->addTargetField($form, null);
                }
            }
        );
    }
    
    private function addTargetField(FormInterface $form, ?Goal $goal)
    {
        if($this->agenda==2063){
            $label = 'basics.objectif';
            $placeholder = 'basics.objectif.placeholder'; 
        }else{
            $label = 'basics.target';
            $placeholder = 'basics.target.placeholder'; 
        }
        $form->add('target', EntityType::class, [
            'label' => $label,
            'class' => Target::class,
            'placeholder' => $placeholder,
            'choices' => $goal ? $goal->getTargets() : []
        ]);
        if($this->agenda==2030){
        if(!$this->communal){
                $form->add('ministere', EntityType::class, [
                'label' => 'basics.ministry',
                'class' => Ministry::class,
                'required' => false,
                'choice_label' => 'name',
                'placeholder' => 'basics.ministereresponsable',
                'query_builder' => function(MinistryRepository $repository) {
                    return $repository->findMinistryByYear(
                            '%'.$this->sessionYear.'%', 
                            $this->sessionMinistry
                        );
                },
            ]);

            $form->add('instad', CheckboxType::class, [
                'label' => 'basics.instad',
                'required' => false
            ]);

            $form->add('desagregations', EntityType::class, [
                'class'=> Desagregation::class,
                'label' => 'basics.desagregations',
                'multiple'=>true,
                'required' => false,
                'query_builder' => function(DesagregationRepository $items) {
                    return $items ->createQueryBuilder('d')
                                  ->where('d.id > 1');
                },
                'attr'=>[
                    'class'=>'form-control select2',
                ]
            ]);
        }

        $form->add('maxValue', NumberType::class, [
            'label' => 'indicator.maxValue',
            'required' => false,
        ]);

        $form->add('minValue', NumberType::class, [
            'label' => 'indicator.minValue',
            'required' => false,
        ]);

        $form->add('refValue', NumberType::class, [
            'label' => 'indicator.refValue',
            'required' => false,
        ]);

        $form->add('refYear', ChoiceType::class, [
            'label' => 'indicator.refYear',
            'choices' => $this->years,
            'placeholder' => '',
            'required' => false,
        ]);
        
        $form->add('unity', ChoiceType::class, [
            'label' => 'basics.unity',
            'choices' => [
                'FCFA'    => 'FCFA',
                'Kilomètre'    => 'km',
                'Kilogramme'    => 'kg',
                'Nombre'      => 'Nombre',
                'Pourcentage'      => '%',
                'Pour mille'    => 'Pour mille',
                'Pour dix mille'    => 'Pour dix mille',
                'Pour cent mille'    => 'Pour cent mille',
            ],
            'placeholder' => 'basics.unity.placeholder',
            'required' => false,
        ]);
    }
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'agenda' => 2030,
            'sessionYear' => null,
            'sessionMinistry' => null,
            'communal' => false,
            'agenda' => 2030,
            'goal' => null,
            'data_class' => Indicator::class
        ));
    }
}
