<?php

namespace App\Services\Features;

use HTMLPurifier;
use HTMLPurifier_Config;

class HtmlSanitizer
{
    private HTMLPurifier $purifier;

    public function __construct()
    {
        $config = HTMLPurifier_Config::createDefault();
        
        // Configuración básica
        $config->set('HTML.Allowed', 'p,br,strong,em,u,strike,sub,sup,h1,h2,h3,h4,h5,h6,ul,ol,li,blockquote,pre,code,a[href|target],img[src|alt|width|height|title],table,thead,tbody,tr,td,th[colspan|rowspan],div,span[style],hr');
        
        // Permitir estilos inline básicos
        $config->set('CSS.AllowedProperties', 'text-align,color,background-color,font-weight,font-style,text-decoration');
        
        // Permitir atributos en enlaces
        $config->set('HTML.TargetBlank', true);
        $config->set('Attr.AllowedFrameTargets', ['_blank', '_self']);
        
        // Configurar URLs permitidas para imágenes y enlaces (solo http y https)
        $config->set('URI.AllowedSchemes', [
            'http' => true,
            'https' => true,
        ]);
        
        // Deshabilitar iframes completamente
        $config->set('HTML.ForbiddenElements', ['iframe', 'script', 'object', 'embed', 'form', 'input', 'button']);
        
        // Configurar directorio de caché
        $cacheDir = storage_path('app/cache/htmlpurifier');
        if (!is_dir($cacheDir)) {
            mkdir($cacheDir, 0755, true);
        }
        $config->set('Cache.SerializerPath', $cacheDir);
        
        $this->purifier = new HTMLPurifier($config);
    }

    /**
     * Sanitiza contenido HTML
     *
     * @param string|null $html
     * @return string
     */
    public function sanitize(?string $html): string
    {
        if (empty($html)) {
            return '';
        }

        return $this->purifier->purify($html);
    }
}

