<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class OptimizeResponse
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        $response = $next($request);

        // Solo aplicar optimizaciones a respuestas HTML
        if ($response instanceof Response && 
            strpos($response->headers->get('Content-Type', ''), 'text/html') !== false) {
            
            $content = $response->getContent();
            
            // Minificar HTML (eliminar espacios en blanco innecesarios)
            if ($content && !app()->environment('local')) {
                $content = $this->minifyHtml($content);
                $response->setContent($content);
            }
            
            // Agregar headers de cache para HTML
            $response->headers->set('Cache-Control', 'no-cache, must-revalidate');
            $response->headers->set('Pragma', 'no-cache');
            
            // Headers de seguridad
            $response->headers->set('X-Content-Type-Options', 'nosniff');
            $response->headers->set('X-Frame-Options', 'SAMEORIGIN');
            $response->headers->set('X-XSS-Protection', '1; mode=block');
        }

        return $response;
    }

    /**
     * Minificar HTML
     */
    private function minifyHtml(string $html): string
    {
        // Preservar bloques de script y style
        $html = preg_replace_callback(
            '/<(script|style)[^>]*>.*?<\/\1>/is',
            function ($matches) {
                return "\n" . $matches[0] . "\n";
            },
            $html
        );

        // Eliminar comentarios HTML (excepto los condicionales de IE)
        $html = preg_replace('/<!--(?!\[if)(?!<!)[^\[>].*?-->/s', '', $html);

        // Reemplazar múltiples espacios, tabs y saltos de línea con un solo espacio
        $html = preg_replace('/\s+/', ' ', $html);

        // Eliminar espacios alrededor de > y <
        $html = preg_replace('/>\s+</', '><', $html);

        return trim($html);
    }
}
