<?php

declare(strict_types=1);

namespace PrestaShop\Module\PolarisPrestaConnector\Controller;

use PrestaShop\Module\PolarisPrestaConnector\UrlRedirectManager;
use Symfony\Component\HttpFoundation\Request;

/**
 * Contrôleur d'administration pour la gestion des règles de redirection URL.
 *
 * Expose une page permettant de lire et modifier le fichier
 * /var/redirects.list directement depuis le backoffice PrestaShop.
 */
class RedirectionsAdminController extends AdminController
{
    /**
     * Rendu de la page de gestion des redirections
     */
    public function redirectionsAction(Request $request)
    {
        $manager = new UrlRedirectManager($this->module);

        // Création du fichier s'il n'existe pas encore
        $manager->ensureFileExists();

        $filePath = $manager->getFilePath();
        $cfg = $this->module->getCfg();

        // Traitement de la soumission du formulaire
        if ($request->isMethod('POST')) {
            
            $productRedirectUrlCreatePattern = $request->request->get('redirects_product', '');            
            $cfg->set(\PrestaShop\Module\PolarisPrestaConnector\SyncConfiguration::CFG_PRODUCT_REDIRECT_URL_CREATE_PATTERN, $productRedirectUrlCreatePattern);

            $rawContent = $request->request->get('redirects_content', '');

            // Validation préalable : on parse les règles pour détecter
            // les regex invalides et prévenir l'utilisateur
            $rules  = $manager->parseRules($rawContent);
            $errors = [];

            foreach ($rules as $i => $rule) {
                $regex = '~' . $rule['pattern'] . '~';
                if (@preg_match($regex, '') === false) {
                    $errors[] = sprintf(
                        'Ligne ignorée — expression régulière invalide : <code>%s</code>',
                        htmlspecialchars($rule['pattern'])
                    );
                }
            }

            try {
                $manager->saveRawContent($rawContent);

                if (!empty($errors)) {
                    // Sauvegarde effectuée mais avec des avertissements
                    $this->addFlash('warning', implode('<br>', $errors));
                    $this->addFlash('warning', 'Le fichier a été sauvegardé, mais les règles en erreur ci-dessus seront ignorées lors des redirections.');
                } else {
                    $this->addFlash('success', sprintf(
                        'Fichier sauvegardé avec succès. %d règle(s) active(s).',
                        count($rules)
                    ));
                }
            } catch (\RuntimeException $e) {
                $this->addFlash('error', $e->getMessage());
            }

            // Rechargement depuis le fichier pour afficher le contenu normalisé
        }

        // Lecture du contenu courant du fichier
        $rawContent = $manager->loadRawContent();

        // Comptage des règles actives pour l'affichage
        $activeRules = $manager->parseRules($rawContent);

        return $this->render(
            '@Modules/' . $this->module->name . '/views/templates/admin/redirections.html.twig',
            $this->addDefaultVars([
                'redirects_content' => $rawContent,
                'file_path'         => $filePath,
                'active_rules_count' => count($activeRules),
                'redirects_product_url_create_pattern' => $this->module->getCfg()->get(\PrestaShop\Module\PolarisPrestaConnector\SyncConfiguration::CFG_PRODUCT_REDIRECT_URL_CREATE_PATTERN, ''),
            ])
        );
    }
}