<?php

namespace App\Support;

class SafeHtml
{
    /** Balises typiques Trix / éditeurs riches (attributs retirés par strip_tags, sauf neutralisation href ci-dessous). */
    private const ALLOWED_TAGS = '<p><br><br/><strong><b><em><i><u><del><s><strike><ul><ol><li><a><span><div><h1><h2><h3><h4><h5><h6><blockquote><figure><figcaption><pre><code>';

    /**
     * Affiche du contenu riche (Trix / HTML léger) ou du texte brut avec retours à la ligne.
     * Décode les entités HTML (ex. contenu collé ou double-échappé : &lt;br&gt; → sauts de ligne réels).
     */
    public static function richText(?string $content): string
    {
        if ($content === null || trim($content) === '') {
            return '';
        }

        $content = self::decodeHtmlEntities($content);

        if (! preg_match('/<[a-zA-Z][\w:-]*/', $content)) {
            return nl2br(e($content));
        }

        $sanitized = strip_tags($content, self::ALLOWED_TAGS);

        return self::neutralizeUnsafeHrefs($sanitized);
    }

    /**
     * Normalise le HTML issu de la BDD (double échappement, copier-coller d’entités) pour le textarea Trix en admin.
     * Le résultat doit toujours être passé dans e() / {{ }} dans la vue.
     */
    public static function normalizeStoredRichText(?string $content): string
    {
        if ($content === null || $content === '') {
            return '';
        }

        return self::decodeHtmlEntities($content);
    }

    /**
     * Décodage itéré pour gérer &amp;lt; → &lt; → < .
     */
    private static function decodeHtmlEntities(string $content): string
    {
        $prev = '';
        $out = $content;
        for ($i = 0; $i < 5 && $out !== $prev; $i++) {
            $prev = $out;
            $out = html_entity_decode($out, ENT_QUOTES | ENT_HTML5, 'UTF-8');
        }

        return $out;
    }

    private static function neutralizeUnsafeHrefs(string $html): string
    {
        $html = preg_replace('/href\s*=\s*"\s*javascript:[^"]*"/i', 'href="#"', $html) ?? $html;
        $html = preg_replace('/href\s*=\s*\'\s*javascript:[^\']*\'/i', "href='#'", $html) ?? $html;
        $html = preg_replace('/href\s*=\s*"\s*data:[^"]*"/i', 'href="#"', $html) ?? $html;

        return $html;
    }
}
