package cmd

import (
	"net/http"
	"os"
	"strings"

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

// isFileIOEnabled проверяет, разрешены ли файловые операции
// По умолчанию включено, отключается только при GO_KNOCKER_ENABLE_FILE_IO=0
func isFileIOEnabled() bool {
	env := os.Getenv("GO_KNOCKER_ENABLE_FILE_IO")
	return env != "0" && env != "false"
}

// authMiddleware - базовая авторизация: пользователь "knocker" + пароль
func authMiddleware(pass string) gin.HandlerFunc {
	return func(c *gin.Context) {
		user, providedPass, ok := c.Request.BasicAuth()
		// Проверяем пользователя "knocker" и пароль
		if !ok || (providedPass != pass || user != "knocker") {
			c.Header("WWW-Authenticate", "Basic realm=Restricted")
			c.AbortWithStatus(http.StatusUnauthorized)
			return
		}
		c.Next()
	}
}

// staticAuthMiddleware - защищает HTML страницы, но пропускает статические ресурсы
func staticAuthMiddleware(pass string) gin.HandlerFunc {
	return func(c *gin.Context) {
		path := c.Request.URL.Path

		// Пропускаем статические ресурсы без авторизации
		if strings.HasSuffix(path, ".js") ||
			strings.HasSuffix(path, ".css") ||
			strings.HasSuffix(path, ".ico") ||
			strings.HasSuffix(path, ".png") ||
			strings.HasSuffix(path, ".jpg") ||
			strings.HasSuffix(path, ".svg") ||
			strings.HasSuffix(path, ".woff") ||
			strings.HasSuffix(path, ".woff2") ||
			strings.HasSuffix(path, ".ttf") ||
			strings.HasSuffix(path, ".eot") ||
			strings.HasSuffix(path, ".webmanifest") ||
			strings.HasPrefix(path, "/api/") {
			c.Next()
			return
		}

		// Для всех остальных путей (в основном HTML) применяем авторизацию
		authMiddleware(pass)(c)
	}
}
