package middleware

import (
	"net/http"
	"strings"

	services "astrology-api/services_astrologer"

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

func AstroAuthMiddleware() gin.HandlerFunc {

	return func(c *gin.Context) {

		authHeader := c.GetHeader("Authorization")

		if authHeader == "" {

			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{
				"status":  false,
				"message": "Token required",
			})

			return
		}

		tokenString := strings.TrimPrefix(authHeader, "Bearer ")

		claims, err := services.ValidateJWT(tokenString)

		if err != nil {

			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{
				"status":  false,
				"message": "Invalid token",
			})

			return
		}

		idValue, ok := claims["id"]

		if !ok {

			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{
				"status":  false,
				"message": "Invalid token",
			})
			return
		}

		var userID uint

		switch v := idValue.(type) {

		case float64:
			userID = uint(v)

		case int:
			userID = uint(v)

		case uint:
			userID = v

		default:

			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{
				"status":  false,
				"message": "Invalid token payload",
			})
			return
		}

		c.Set("user_id", userID)

		c.Next()
	}
}
