<?php

namespace App\Form;

use App\Service\SettingsManager;
use Misd\PhoneNumberBundle\Form\Type\PhoneNumberType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

class SettingsType extends AbstractType
{
    private $settingsManager;

    public function __construct(SettingsManager $settingsManager) 
    {
        $this->settingsManager = $settingsManager;
    }

    private function createPlaceholder($value)
    {
        return implode('', array_pad([], strlen($value), '•'));
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('brand_name', TextType::class, [
                'label' => 'form.settings.brand_name.label'
            ])
            ->add('administrator_email', EmailType::class, [
                'label' => 'form.settings.administrator_email.label'
            ])
            ->add('phone_number', TextType::class, [
                'label' => 'form.settings.phone_number.label',
                'required' => false,
            ])
            ->add('home_intro', TextareaType::class, [
                'label' => 'form.settings.home_intro.label',
                'required' => false,
            ])
            ->add('ministry_weight', TextType::class, [
                'label' => 'form.settings.ministry_weight.label'
            ])
            ->add('google_api_key', TextType::class, [
                'label' => 'form.settings.google_api_key.label'
            ])
            ->add('latlng', TextType::class, [
                'label' => 'form.settings.latlng.label'
            ])
            ;

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

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

            foreach ($data as $name => $value) {
                if ($this->settingsManager->isSecret($name)) {

                    $config = $form->get($name)->getConfig();
                    $options = $config->getOptions();

                    $options['empty_data'] = $value;
                    $options['required'] = false;
                    $options['attr'] = [
                        'placeholder' => $this->createPlaceholder($value)
                    ];

                    $form->add($name, PasswordType::class, $options);
                }
            }

        });
    }

}
