// 🚀 Fiber is an Express inspired web framework written in Go with 💖
// 📌 API Documentation: https://docs.gofiber.io/
// 📝 Github Repository: https://github.com/gofiber/fiber

package helmet

import (
	

	
)

// Config ...
type Config struct {
	// Filter defines a function to skip middleware.
	// Optional. Default: nil
	Filter func(*fiber.Ctx) bool
	// XSSProtection
	// Optional. Default value "0".
	XSSProtection string
	// ContentTypeNosniff
	// Optional. Default value "nosniff".
	ContentTypeNosniff string
	// XFrameOptions
	// Optional. Default value "SAMEORIGIN".
	// Possible values: "SAMEORIGIN", "DENY", "ALLOW-FROM uri"
	XFrameOptions string
	// HSTSMaxAge
	// Optional. Default value 0.
	HSTSMaxAge int
	// HSTSExcludeSubdomains
	// Optional. Default value false.
	HSTSExcludeSubdomains bool
	// ContentSecurityPolicy
	// Optional. Default value "".
	ContentSecurityPolicy string
	// CSPReportOnly
	// Optional. Default value false.
	CSPReportOnly bool
	// HSTSPreloadEnabled
	// Optional. Default value false.
	HSTSPreloadEnabled bool
	// ReferrerPolicy
	// Optional. Default value "no-referrer".
	ReferrerPolicy string
	// Permissions-Policy
	// Optional. Default value "".
	PermissionPolicy string
	// Cross-Origin-Embedder-Policy
	// Optional. Default value "require-corp".
	CrossOriginEmbedderPolicy string
	// Cross-Origin-Opener-Policy
	// Optional. Default value "same-origin".
	CrossOriginOpenerPolicy string
	// Cross-Origin-Resource-Policy
	// Optional. Default value "same-origin".
	CrossOriginResourcePolicy string
	// Origin-Agent-Cluster
	// Optional. Default value "?1".
	OriginAgentCluster string
	// X-DNS-Prefetch-Control
	// Optional. Default value "off".
	XDNSPrefetchControl string
	// X-Download-Options
	// Optional. Default value "noopen".
	XDownloadOptions string
	// X-Permitted-Cross-Domain-Policies
	// Optional. Default value "none".
	XPermittedCrossDomain string
}

// New ...
func ( ...Config) fiber.Handler {
	// Init config
	var  Config
	if len() > 0 {
		 = [0]
	}
	// Set config default values
	if .XSSProtection == "" {
		.XSSProtection = "0"
	}
	if .ContentTypeNosniff == "" {
		.ContentTypeNosniff = "nosniff"
	}
	if .XFrameOptions == "" {
		.XFrameOptions = "SAMEORIGIN"
	}
	if .ReferrerPolicy == "" {
		.ReferrerPolicy = "no-referrer"
	}
	if .CrossOriginEmbedderPolicy == "" {
		.CrossOriginEmbedderPolicy = "require-corp"
	}
	if .CrossOriginOpenerPolicy == "" {
		.CrossOriginOpenerPolicy = "same-origin"
	}
	if .CrossOriginResourcePolicy == "" {
		.CrossOriginResourcePolicy = "same-origin"
	}
	if .OriginAgentCluster == "" {
		.OriginAgentCluster = "?1"
	}
	if .XDNSPrefetchControl == "" {
		.XDNSPrefetchControl = "off"
	}
	if .XDownloadOptions == "" {
		.XDownloadOptions = "noopen"
	}
	if .XPermittedCrossDomain == "" {
		.XPermittedCrossDomain = "none"
	}

	// Return middleware handler
	return func( *fiber.Ctx) error {
		// Filter request to skip middleware
		if .Filter != nil && .Filter() {
			return .Next()
		}

		// Set headers
		if .XSSProtection != "" {
			.Set(fiber.HeaderXXSSProtection, .XSSProtection)
		}
		if .ContentTypeNosniff != "" {
			.Set(fiber.HeaderXContentTypeOptions, .ContentTypeNosniff)
		}
		if .XFrameOptions != "" {
			.Set(fiber.HeaderXFrameOptions, .XFrameOptions)
		}
		if .CrossOriginEmbedderPolicy != "" {
			.Set("Cross-Origin-Embedder-Policy", .CrossOriginEmbedderPolicy)
		}
		if .CrossOriginOpenerPolicy != "" {
			.Set("Cross-Origin-Opener-Policy", .CrossOriginOpenerPolicy)
		}
		if .CrossOriginResourcePolicy != "" {
			.Set("Cross-Origin-Resource-Policy", .CrossOriginResourcePolicy)
		}
		if .OriginAgentCluster != "" {
			.Set("Origin-Agent-Cluster", .OriginAgentCluster)
		}
		if .ReferrerPolicy != "" {
			.Set("Referrer-Policy", .ReferrerPolicy)
		}
		if .XDNSPrefetchControl != "" {
			.Set("X-DNS-Prefetch-Control", .XDNSPrefetchControl)
		}
		if .XDownloadOptions != "" {
			.Set("X-Download-Options", .XDownloadOptions)
		}
		if .XPermittedCrossDomain != "" {
			.Set("X-Permitted-Cross-Domain-Policies", .XPermittedCrossDomain)
		}

		// Handle HSTS headers
		if .Protocol() == "https" && .HSTSMaxAge != 0 {
			 := ""
			if !.HSTSExcludeSubdomains {
				 = "; includeSubDomains"
			}
			if .HSTSPreloadEnabled {
				 = fmt.Sprintf("%s; preload", )
			}
			.Set(fiber.HeaderStrictTransportSecurity, fmt.Sprintf("max-age=%d%s", .HSTSMaxAge, ))
		}

		// Handle Content-Security-Policy headers
		if .ContentSecurityPolicy != "" {
			if .CSPReportOnly {
				.Set(fiber.HeaderContentSecurityPolicyReportOnly, .ContentSecurityPolicy)
			} else {
				.Set(fiber.HeaderContentSecurityPolicy, .ContentSecurityPolicy)
			}
		}

		// Handle Permissions-Policy headers
		if .PermissionPolicy != "" {
			.Set(fiber.HeaderPermissionsPolicy, .PermissionPolicy)
		}

		return .Next()
	}
}