<?php

declare(strict_types=1);

namespace App\Form;

use App\Entity\Ecole;
use App\Entity\Theme;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;

final class EcoleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('nom', TextType::class, [
                'label' => 'Nom de la madrassa',
                'attr' => ['placeholder' => 'Madrassatoul Qamar'],
            ])
            ->add('slug', TextType::class, [
                'label' => 'Slug',
                'attr' => ['placeholder' => 'qamar'],
            ])
            ->add('sousDomaine', TextType::class, [
                'label' => 'Sous-domaine canonique',
                'help' => 'Exemple : darulilm génère darulilm.salsabil.cm si APP_PUBLIC_DOMAIN=salsabil.cm.',
                'attr' => ['placeholder' => 'alqamar'],
            ])
            ->add('domainAliasesText', TextareaType::class, [
                'label' => 'Alias de domaines',
                'mapped' => false,
                'required' => false,
                'help' => 'Un host par ligne, sans https:// ni chemin. Exemple : daroulilm.salsabil.cm',
                'attr' => ['rows' => 3, 'placeholder' => "daroulilm.salsabil.cm\nancien-domaine.cm"],
            ])
            ->add('prefixeMatricule', TextType::class, [
                'label' => 'Préfixe matricule',
                'attr' => ['placeholder' => 'MQO'],
            ])
            ->add('dernierNumeroMatricule', IntegerType::class, [
                'label' => 'Dernier numéro matricule',
                'attr' => ['min' => 0],
            ])
            ->add('themePublic', EntityType::class, [
                'class' => Theme::class,
                'choice_label' => 'nom',
                'label' => 'Thème public',
                'placeholder' => 'Choisir un thème',
                'required' => false,
            ])
            ->add('logoFile', FileType::class, [
                'label' => 'Logo',
                'required' => false,
                'mapped' => false,
                'help' => 'PNG, JPG, WEBP, SVG ou ICO. Le fichier actuel est conservé si aucun fichier n’est choisi.',
                'constraints' => [
                    new Assert\File(
                        maxSize: '3M',
                        mimeTypes: [
                            'image/png',
                            'image/jpeg',
                            'image/webp',
                            'image/svg+xml',
                            'image/x-icon',
                            'image/vnd.microsoft.icon',
                        ],
                        mimeTypesMessage: 'Veuillez téléverser une image valide : PNG, JPG, WEBP, SVG ou ICO.',
                    ),
                ],
            ])
            ->add('heroImageFile', FileType::class, [
                'label' => 'Image hero ou flyer public',
                'required' => false,
                'mapped' => false,
                'help' => 'Image utilisée dans le hero public de la madrassa. PNG, JPG ou WEBP conseillé.',
                'constraints' => [
                    new Assert\File(
                        maxSize: '4M',
                        mimeTypes: [
                            'image/png',
                            'image/jpeg',
                            'image/webp',
                        ],
                        mimeTypesMessage: 'Veuillez téléverser une image valide : PNG, JPG ou WEBP.',
                    ),
                ],
            ])
            ->add('presentationImage1File', FileType::class, [
                'label' => 'Image présentation 1',
                'required' => false,
                'mapped' => false,
                'help' => 'Grande image de la galerie présentation. PNG, JPG ou WEBP conseillé.',
                'constraints' => [
                    new Assert\File(
                        maxSize: '4M',
                        mimeTypes: [
                            'image/png',
                            'image/jpeg',
                            'image/webp',
                        ],
                        mimeTypesMessage: 'Veuillez téléverser une image valide : PNG, JPG ou WEBP.',
                    ),
                ],
            ])
            ->add('presentationImage2File', FileType::class, [
                'label' => 'Image présentation 2',
                'required' => false,
                'mapped' => false,
                'help' => 'Image secondaire de la galerie présentation. PNG, JPG ou WEBP conseillé.',
                'constraints' => [
                    new Assert\File(
                        maxSize: '4M',
                        mimeTypes: [
                            'image/png',
                            'image/jpeg',
                            'image/webp',
                        ],
                        mimeTypesMessage: 'Veuillez téléverser une image valide : PNG, JPG ou WEBP.',
                    ),
                ],
            ])
            ->add('presentationImage3File', FileType::class, [
                'label' => 'Image présentation 3',
                'required' => false,
                'mapped' => false,
                'help' => 'Image secondaire de la galerie présentation. PNG, JPG ou WEBP conseillé.',
                'constraints' => [
                    new Assert\File(
                        maxSize: '4M',
                        mimeTypes: [
                            'image/png',
                            'image/jpeg',
                            'image/webp',
                        ],
                        mimeTypesMessage: 'Veuillez téléverser une image valide : PNG, JPG ou WEBP.',
                    ),
                ],
            ])
            ->add('faviconFile', FileType::class, [
                'label' => 'Favicon',
                'required' => false,
                'mapped' => false,
                'help' => 'Format conseillé : PNG, ICO ou SVG carré. Le fichier actuel est conservé si aucun fichier n’est choisi.',
                'constraints' => [
                    new Assert\File(
                        maxSize: '1M',
                        mimeTypes: [
                            'image/png',
                            'image/jpeg',
                            'image/webp',
                            'image/svg+xml',
                            'image/x-icon',
                            'image/vnd.microsoft.icon',
                        ],
                        mimeTypesMessage: 'Veuillez téléverser un favicon valide : PNG, JPG, WEBP, SVG ou ICO.',
                    ),
                ],
            ])
            ->add('description', TextareaType::class, [
                'label' => 'Description',
                'required' => false,
                'attr' => ['rows' => 4],
            ])
            ->add('slogan', TextType::class, [
                'label' => 'Slogan',
                'required' => false,
            ])
            ->add('email', EmailType::class, [
                'label' => 'Email',
                'required' => false,
            ])
            ->add('telephone1', TextType::class, [
                'label' => 'Téléphone 1',
                'required' => false,
            ])
            ->add('telephone2', TextType::class, [
                'label' => 'Téléphone 2',
                'required' => false,
            ])
            ->add('whatsapp', TextType::class, [
                'label' => 'WhatsApp',
                'required' => false,
            ])
            ->add('adresse', TextType::class, [
                'label' => 'Adresse',
                'required' => false,
            ])
            ->add('ville', TextType::class, [
                'label' => 'Ville',
                'required' => false,
            ])
            ->add('pays', TextType::class, [
                'label' => 'Pays',
                'required' => false,
            ])
            ->add('couleurPrincipale', TextType::class, [
                'label' => 'Couleur principale',
                'required' => false,
                'attr' => ['placeholder' => '#5B3A70'],
            ])
            ->add('couleurSecondaire', TextType::class, [
                'label' => 'Couleur secondaire',
                'required' => false,
                'attr' => ['placeholder' => '#E9C7D8'],
            ])
            ->add('couleurAccent', TextType::class, [
                'label' => 'Couleur accent',
                'required' => false,
                'attr' => ['placeholder' => '#C9A24D'],
            ])
            ->add('heroTitle', TextType::class, [
                'label' => 'Titre hero',
                'required' => false,
            ])
            ->add('heroSubtitle', TextareaType::class, [
                'label' => 'Sous-titre hero',
                'required' => false,
                'attr' => ['rows' => 3],
            ])
            ->add('aboutTitle', TextType::class, [
                'label' => 'Titre présentation',
                'required' => false,
            ])
            ->add('aboutText', TextareaType::class, [
                'label' => 'Texte présentation',
                'required' => false,
                'attr' => ['rows' => 4],
            ])
            ->add('ctaTitle', TextType::class, [
                'label' => 'Titre appel à l’action',
                'required' => false,
            ])
            ->add('ctaText', TextareaType::class, [
                'label' => 'Texte appel à l’action',
                'required' => false,
                'attr' => ['rows' => 3],
            ])
            ->add('active', CheckboxType::class, [
                'label' => 'École active',
                'required' => false,
            ]);

        $builder->addEventListener(FormEvents::POST_SET_DATA, static function (FormEvent $event): void {
            $ecole = $event->getData();
            $form = $event->getForm();

            if (!$ecole instanceof Ecole || !$form->has('domainAliasesText')) {
                return;
            }

            $form->get('domainAliasesText')->setData(implode("\n", $ecole->getActiveAliasHosts()));
        });
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => Ecole::class,
        ]);
    }
}
