package middleware

import (
	"os"
	"strings"

	"github.com/gin-gonic/gin"
)

// SecurityHeaders ajoute des headers de sécurité HTTP recommandés
// BE-SEC-011: Enhanced security headers implementation
// MOD-P2-005: Headers sécurité manquants (HSTS, CSP, X-Frame-Options, etc.)
func SecurityHeaders() gin.HandlerFunc {
	return func(c *gin.Context) {
		// BE-SEC-011: Strict-Transport-Security (HSTS) - Force HTTPS
		// Only set HSTS in production (not in development)
		// Max-Age: 31536000 = 1 an
		// IncludeSubDomains: inclut tous les sous-domaines
		// Preload: permet d'être inclus dans les listes de préchargement HSTS des navigateurs
		if isProduction() {
			c.Header("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload")
		}

		// BE-SEC-011: X-Content-Type-Options - Empêche le MIME type sniffing
		// Force le navigateur à respecter le Content-Type déclaré
		c.Header("X-Content-Type-Options", "nosniff")

		// BE-SEC-011: X-Frame-Options - Empêche le clickjacking
		// DENY: empêche le site d'être affiché dans une frame (iframe, embed, object)
		c.Header("X-Frame-Options", "DENY")

		// BE-SEC-011: X-XSS-Protection - Protection XSS (déprécié mais encore supporté par certains navigateurs)
		// mode=block: bloque la page si une attaque XSS est détectée
		c.Header("X-XSS-Protection", "1; mode=block")

		// BE-SEC-011: Referrer-Policy - Contrôle les informations de referrer envoyées
		// strict-origin-when-cross-origin: envoie l'origine complète pour les requêtes same-origin,
		// seulement l'origine pour les requêtes cross-origin HTTPS->HTTPS, rien pour HTTPS->HTTP
		c.Header("Referrer-Policy", "strict-origin-when-cross-origin")

		// BE-SEC-011: Permissions-Policy (formerly Feature-Policy) - Contrôle les fonctionnalités du navigateur
		// Désactive les fonctionnalités non nécessaires pour une API REST
		c.Header("Permissions-Policy", "geolocation=(), microphone=(), camera=(), payment=(), usb=(), magnetometer=(), gyroscope=(), accelerometer=()")

		// BE-SEC-011: Content-Security-Policy (CSP) - Contrôle les ressources chargées
		// Pour une API REST, on peut être strict car on ne sert pas de HTML
		// default-src 'none': bloque tout par défaut
		// script-src 'none': bloque les scripts
		// style-src 'none': bloque les styles
		// img-src 'none': bloque les images
		// connect-src 'self': permet les requêtes vers la même origine (pour les appels API)
		// frame-ancestors 'none': empêche l'embedding (complément de X-Frame-Options)
		c.Header("Content-Security-Policy", "default-src 'none'; script-src 'none'; style-src 'none'; img-src 'none'; connect-src 'self'; frame-ancestors 'none'")

		// BE-SEC-011: X-Permitted-Cross-Domain-Policies - Contrôle les politiques cross-domain pour Flash/PDF
		// none: empêche les politiques cross-domain
		c.Header("X-Permitted-Cross-Domain-Policies", "none")

		// BE-SEC-011: Cross-Origin-Embedder-Policy - Empêche l'embedding cross-origin
		// require-corp: nécessite que les ressources soient marquées comme cross-origin
		c.Header("Cross-Origin-Embedder-Policy", "require-corp")

		// BE-SEC-011: Cross-Origin-Opener-Policy - Isole les contextes de navigation
		// same-origin: isole les contextes de navigation à la même origine
		c.Header("Cross-Origin-Opener-Policy", "same-origin")

		// BE-SEC-011: Cross-Origin-Resource-Policy - Contrôle qui peut charger les ressources
		// same-origin: seules les requêtes de la même origine peuvent charger les ressources
		c.Header("Cross-Origin-Resource-Policy", "same-origin")

		c.Next()
	}
}

// isProduction vérifie si l'application est en mode production
func isProduction() bool {
	env := strings.ToLower(os.Getenv("APP_ENV"))
	return env == "production" || env == "prod"
}
