package main

import (
	"strings"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// LoggingMiddleware 创建一个请求日志中间件
// 该中间件会在每个HTTP请求进入时记录请求信息，在响应返回时记录响应信息
// 参数: 无
// 返回值: gin.HandlerFunc - Gin框架的中间件处理函数
func LoggingMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 记录请求日志：方法、路径、客户端IP
		Logger.Info("请求",
			zap.String("方法", c.Request.Method),
			zap.String("路径", c.Request.URL.Path),
			zap.String("IP", c.ClientIP()),
		)

		c.Next()

		// 记录响应日志：路径、状态码
		Logger.Info("响应",
			zap.String("路径", c.Request.URL.Path),
			zap.Int("状态码", c.Writer.Status()),
		)
	}
}

// AuthMiddleware JWT 认证中间件
// 参数: cfg - 配置对象，包含JWT密钥等配置信息
// 返回值: gin.HandlerFunc - Gin框架的中间件处理函数
func AuthMiddleware(cfg *Config) gin.HandlerFunc {
	return func(c *gin.Context) {
		authHeader := c.GetHeader("Authorization")

		if authHeader == "" {
			c.JSON(401, gin.H{"错误": "错误的认证头"})
			c.Abort()
			return
		}

		// 解析Authorization头，验证格式为 "Bearer <token>"
		parts := strings.SplitN(authHeader, " ", 2)
		if len(parts) != 2 || parts[0] != "Bearer" {
			c.JSON(401, gin.H{"错误": "错误的认证头"})
			c.Abort()
			return
		}

		// 验证JWT token的有效性
		claims, err := VerifyToken(parts[1], cfg.JWT.Secret)
		if err != nil {
			Logger.Error("验证token失败", zap.Error(err))
			c.JSON(401, gin.H{"错误": "验证token失败"})
			c.Abort()
			return
		}

		// 将用户信息保存到上下文
		c.Set("user_id", claims.UserID)
		c.Set("email", claims.Email)
		c.Next()
	}
}

// CORSMiddleware 创建并返回一个CORS（跨域资源共享）中间件处理器
// 该中间件用于处理跨域请求，设置相应的响应头信息
//
// 参数:
//
//	无
//
// 返回值:
//
//	gin.HandlerFunc - Gin框架的中间件处理器函数
func CORSMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 设置CORS相关响应头
		c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
		c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
		c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")

		// 处理预检请求（OPTIONS方法）
		if c.Request.Method == "OPTIONS" {
			c.AbortWithStatus(204)
			return
		}
		c.Next()
	}
}
