package middleware

import (
	"net/http"
	"strings"

	"github.com/1Panel-dev/1Panel/core/utils/security"
	"github.com/gin-gonic/gin"
)

func FrontendFallback() gin.HandlerFunc {
	return func(c *gin.Context) {
		if !isFrontendFallbackRequest(c) {
			c.Next()
			return
		}
		if security.CanServeFrontendPath(c) {
			security.ToIndexHtml(c)
			c.Abort()
			return
		}
		security.HandleNotSecurity(c, "")
		c.Abort()
	}
}

func isFrontendFallbackRequest(c *gin.Context) bool {
	if c.Request.Method != http.MethodGet && c.Request.Method != http.MethodHead {
		return false
	}
	path := c.Request.URL.Path
	if strings.HasPrefix(path, "/api/") ||
		strings.HasPrefix(path, "/assets/") ||
		strings.HasPrefix(path, "/public") ||
		strings.HasPrefix(path, "/1panel/swagger/") ||
		path == "/favicon.ico" {
		return false
	}
	if !security.IsFrontendPath(path) {
		return false
	}
	accept := c.GetHeader("Accept")
	return accept == "" || strings.Contains(accept, "text/html")
}