// src/SIGCM.API/Middleware/SecurityHeadersMiddleware.cs
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;

namespace SIGCM.API.Middleware
{
    public class SecurityHeadersMiddleware
    {
        private readonly RequestDelegate _next;

        public SecurityHeadersMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            // 1. Content-Security-Policy (CSP)
            // Permitimos scripts de dominio propio, estilos, imágenes y fuentes.
            // Ajustamos para permitir Mercado Pago y fuentes de Google si es necesario.
            context.Response.Headers.Append("Content-Security-Policy", 
                "default-src 'self'; " +
                "script-src 'self' 'unsafe-inline' 'unsafe-eval' https://sdk.mercadopago.com; " +
                "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; " +
                "font-src 'self' https://fonts.gstatic.com data:; " +
                "img-src 'self' data: https://*.mercadopago.com; " +
                "frame-src 'self' https://*.mercadopago.com; " +
                "connect-src 'self' https://api.mercadopago.com;");

            // 2. Strict-Transport-Security (HSTS)
            // Indica que el sitio solo debe ser accedido vía HTTPS (1 año)
            context.Response.Headers.Append("Strict-Transport-Security", "max-age=31536000; includeSubDomains");

            // 3. X-Content-Type-Options
            // Previene que el navegador intente "adivinar" el tipo MIME (MIME sniffing)
            context.Response.Headers.Append("X-Content-Type-Options", "nosniff");

            // 4. X-Frame-Options
            // Protege contra Clickjacking al prevenir que el sitio sea embebido en iframes externos
            context.Response.Headers.Append("X-Frame-Options", "SAMEORIGIN");

            // 5. Referrer-Policy
            // Controla cuánta información de referencia se envía en las peticiones
            context.Response.Headers.Append("Referrer-Policy", "strict-origin-when-cross-origin");

            // 6. X-XSS-Protection
            // Filtro contra XSS (aunque CSP es el estándar moderno, esto es para navegadores antiguos)
            context.Response.Headers.Append("X-XSS-Protection", "1; mode=block");

            // 7. Permissions-Policy
            // Restringe el acceso a APIs del navegador (Cámara, Micrófono, etc.)
            context.Response.Headers.Append("Permissions-Policy", "camera=(), microphone=(), geolocation=()");

            await _next(context);
        }
    }
}
