package middleware

import (
	"github.com/exhibition-main/internal/model"
	"github.com/exhibition-main/internal/msg"
	"github.com/exhibition-main/internal/response"
	"github.com/exhibition-main/pkg/jwt"
	"github.com/gin-gonic/gin"

	"strings"
)

// JWTAuthMiddleware 基于JWT的认证中间件
func JWTAuthMiddleware() func(c *gin.Context) {
	return func(c *gin.Context) {
		authHeader := c.Request.Header.Get("Authorization")
		if authHeader == "" {
			response.ResponseQuickMsg(c, msg.Fail, msg.NEED_LOGIN, nil)
			c.Abort()
			return
		}
		// 按空格分割
		parts := strings.SplitN(authHeader, " ", 2)
		if !(len(parts) == 2 && parts[0] == "Bearer") {
			response.ResponseMsg(c, msg.StatusUnauthorized, model.Response{
				Status: msg.Fail,
				Data:   nil,
				Msg:    msg.NEED_LOGIN,
			})
			c.Abort()
			return
		}
		// parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它
		jwtInfo, err := jwt.ParseToken(parts[1])
		if err != nil {
			response.ResponseMsg(c, msg.StatusUnauthorized, model.Response{
				Status: msg.Fail,
				Data:   nil,
				Msg:    msg.INVALID_TOKEN,
			})
			c.Abort()
			return
		}
		// 将当前请求的userID信息保存到请求的上下文c上
		c.Set(model.CTX_USER_INFO, jwt.MyClaims{
			UserId:   jwtInfo.UserId,
			Nickname: jwtInfo.Nickname,
			Phone:    jwtInfo.Phone,
			Openid:   jwtInfo.Openid,
		})
		c.Next() // 后续的处理请求的函数中 可以用过c.Get(CtxUserIDKey) 来获取当前请求的用户信息
	}
}