<?php

declare(strict_types=1);

namespace App\Form;

use App\Entity\Ecole;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;

final class SchoolConfigurationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $imageMimeTypes = ['image/png', 'image/jpeg', 'image/webp', 'image/svg+xml'];

        $builder
            ->add('logoFile', FileType::class, [
                'label' => 'Logo de la madrassa',
                'mapped' => false,
                'required' => false,
                'help' => 'PNG, JPG, WEBP ou SVG. Le logo actuel est conservé si aucun fichier n’est choisi.',
                'constraints' => [
                    new Assert\File(
                        maxSize: '3M',
                        mimeTypes: $imageMimeTypes,
                        mimeTypesMessage: 'Veuillez téléverser une image valide : PNG, JPG, WEBP ou SVG.',
                    ),
                ],
            ])
            ->add('faviconFile', FileType::class, [
                'label' => 'Favicon',
                'mapped' => false,
                'required' => false,
                'help' => 'PNG, ICO ou SVG carré conseillé. Le favicon actuel est conservé si aucun fichier n’est choisi.',
                'constraints' => [
                    new Assert\File(
                        maxSize: '1M',
                        mimeTypes: [...$imageMimeTypes, 'image/x-icon', 'image/vnd.microsoft.icon'],
                        mimeTypesMessage: 'Veuillez téléverser un favicon valide : PNG, JPG, WEBP, SVG ou ICO.',
                    ),
                ],
            ])
            ->add('heroImageFile', FileType::class, [
                'label' => 'Image hero / flyer public',
                'mapped' => false,
                'required' => false,
                'help' => 'Image mise en avant sur la page publique. 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',
                'mapped' => false,
                'required' => 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',
                'mapped' => false,
                'required' => 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',
                'mapped' => false,
                'required' => 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('imageSignatureAdministrationFile', FileType::class, [
                'label' => 'Signature administrative',
                'mapped' => false,
                'required' => false,
                'help' => 'PNG ou JPG conseillé. La signature actuelle est conservée si aucun fichier n’est choisi.',
                'constraints' => [
                    new Assert\File(
                        maxSize: '2M',
                        mimeTypes: ['image/png', 'image/jpeg'],
                        mimeTypesMessage: 'Veuillez téléverser une signature valide : PNG ou JPG.',
                    ),
                ],
            ])
            ->add('imageCachetAdministrationFile', FileType::class, [
                'label' => 'Cachet administratif',
                'mapped' => false,
                'required' => false,
                'help' => 'PNG ou JPG conseillé. Le cachet actuel est conservé si aucun fichier n’est choisi.',
                'constraints' => [
                    new Assert\File(
                        maxSize: '2M',
                        mimeTypes: ['image/png', 'image/jpeg'],
                        mimeTypesMessage: 'Veuillez téléverser un cachet valide : PNG ou JPG.',
                    ),
                ],
            ])
            ->add('slogan', TextType::class, ['label' => 'Slogan', 'required' => false])
            ->add('description', TextareaType::class, ['label' => 'Description courte', 'required' => false, 'attr' => ['rows' => 4]])
            ->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' => 5]])
            ->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('reglementInterieur', TextareaType::class, [
                'label' => 'Règlement intérieur',
                'required' => false,
                'help' => 'Ce texte sera ajouté en page 2 de la fiche PDF d’inscription.',
                'attr' => [
                    'rows' => 10,
                    'placeholder' => "Ex : assiduité, ponctualité, respect des enseignants, modalités de paiement, usage du groupe WhatsApp...",
                ],
            ])
            ->add('telephone1', TextType::class, ['label' => 'Téléphone principal', 'required' => false])
            ->add('telephone2', TextType::class, ['label' => 'Téléphone secondaire', 'required' => false])
            ->add('whatsapp', TextType::class, ['label' => 'WhatsApp', 'required' => false])
            ->add('email', EmailType::class, ['label' => 'Email public', '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' => '#0F5C45']])
            ->add('couleurSecondaire', TextType::class, ['label' => 'Couleur secondaire', 'required' => false, 'attr' => ['placeholder' => '#DDEFE7']])
            ->add('couleurAccent', TextType::class, ['label' => 'Couleur accent', 'required' => false, 'attr' => ['placeholder' => '#C79A3B']]);
    }

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