<?php

namespace CpCreation\VitiCore\Bridge\Symfony\Bundle\Form\Admin;

use CpCreation\VitiCore\Shop\Model\ShopConfig;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
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;

final class TrackingConfigType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('googleTagManagerId', TextType::class, [
                'required' => false,
                'label' => 'Google Tag Manager',
                'help' => 'Identifiant GTM, par exemple GTM-XXXXXXX.',
            ])
            ->add('googleAnalyticsIds', TextareaType::class, [
                'required' => false,
                'label' => 'IDs Google Analytics / Google Ads',
                'help' => 'Un identifiant par ligne. Exemple : G-XXXXXXX ou AW-XXXXXXX.',
                'attr' => [
                    'rows' => 4,
                    'placeholder' => "G-XXXXXXXXXX\nAW-XXXXXXXXXX",
                ],
            ])
            ->add('facebookPixelIds', TextareaType::class, [
                'required' => false,
                'label' => 'IDs Facebook Pixel / Meta Pixel',
                'help' => 'Un identifiant par ligne.',
                'attr' => [
                    'rows' => 4,
                    'placeholder' => "123456789012345\n987654321098765",
                ],
            ])
            ->add('trackingHeadScripts', TextareaType::class, [
                'required' => false,
                'label' => 'Snippets personnalisés dans le <head>',
                'help' => 'Pour LinkedIn Insight Tag, TikTok Pixel, Pinterest Tag ou tout autre script à injecter dans le head.',
                'attr' => [
                    'rows' => 10,
                    'class' => 'font-monospace',
                ],
            ])
            ->add('trackingBodyScripts', TextareaType::class, [
                'required' => false,
                'label' => 'Snippets personnalisés au début du <body>',
                'help' => 'Pour les balises noscript ou les scripts qui doivent être injectés juste après l’ouverture du body.',
                'attr' => [
                    'rows' => 10,
                    'class' => 'font-monospace',
                ],
            ])
            ->add('enableCheckoutEventTracking', CheckboxType::class, [
                'required' => false,
                'label' => 'Activer l’événement `begin_checkout`',
                'help' => 'Nom exact envoyé à Google Analytics : begin_checkout. Déclenché automatiquement sur la page checkout.',
            ])
            ->add('enablePaymentSuccessEventTracking', CheckboxType::class, [
                'required' => false,
                'label' => 'Activer l’événement `purchase`',
                'help' => 'Nom exact envoyé à Google Analytics : purchase. Déclenché automatiquement sur la confirmation de paiement avec les données dynamiques de commande.',
            ])
            ->add('enablePaymentErrorEventTracking', CheckboxType::class, [
                'required' => false,
                'label' => 'Activer l’événement `payment_failed`',
                'help' => 'Nom exact envoyé à Google Analytics : payment_failed. Déclenché automatiquement lors d’un retour de paiement refusé ou en erreur.',
            ])
            ->add('enablePaymentCanceledEventTracking', CheckboxType::class, [
                'required' => false,
                'label' => 'Activer l’événement `payment_canceled`',
                'help' => 'Nom exact envoyé à Google Analytics : payment_canceled. Déclenché automatiquement quand le client annule le paiement.',
            ])
            ->add('enableContactPageEventTracking', CheckboxType::class, [
                'required' => false,
                'label' => 'Activer l’événement `view_contact_page`',
                'help' => 'Nom exact envoyé à Google Analytics : view_contact_page. Déclenché automatiquement sur la page contact.',
            ])
            ->add('enableContactSuccessEventTracking', CheckboxType::class, [
                'required' => false,
                'label' => 'Activer l’événement `generate_lead`',
                'help' => 'Nom exact envoyé à Google Analytics : generate_lead. Déclenché automatiquement après l’envoi réussi du formulaire de contact.',
            ]);

        $builder->get('googleAnalyticsIds')->addModelTransformer(new CallbackTransformer(
            static fn (?array $ids): string => implode("\n", $ids ?? []),
            static fn (?string $ids): array => self::parseTrackerTextarea($ids),
        ));

        $builder->get('facebookPixelIds')->addModelTransformer(new CallbackTransformer(
            static fn (?array $ids): string => implode("\n", $ids ?? []),
            static fn (?string $ids): array => self::parseTrackerTextarea($ids),
        ));
    }

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

    /**
     * @return list<string>
     */
    private static function parseTrackerTextarea(?string $value): array
    {
        if (null === $value) {
            return [];
        }

        $trackers = preg_split('/\R+/', $value) ?: [];
        $trackers = array_map(
            static fn (string $tracker): string => mb_strtoupper(mb_trim($tracker)),
            $trackers,
        );
        $trackers = array_values(array_filter($trackers, static fn (string $tracker): bool => '' !== $tracker));

        return array_values(array_unique($trackers));
    }
}
