package users

import (
	"time"
	db "ttime/internal/database"
	"ttime/internal/types"

	"github.com/gofiber/fiber/v2"
	"github.com/gofiber/fiber/v2/log"
	"github.com/golang-jwt/jwt/v5"
)

//	@Summary		Login
//	@Description	Logs in a user and returns a JWT token
//	@Tags			Auth
//	@Accept			json
//	@Produce		json
//	@Param			body	body		types.NewUser	true	"User credentials"
//	@Success		200		{object}	types.Token		"JWT token"
//	@Failure		400		{string}	string			"Bad request"
//	@Failure		401		{string}	string			"Unauthorized"
//	@Failure		500		{string}	string			"Internal server error"
//	@Router			/login [post]
//
// Login logs in a user and returns a JWT token
func Login(c *fiber.Ctx) error {
	// The body type is identical to a NewUser

	u := new(types.NewUser)
	if err := c.BodyParser(u); err != nil {
		log.Warn("Error parsing body")
		return c.Status(400).SendString(err.Error())
	}

	log.Info("Username logging in:", u.Username)
	if !db.GetDb(c).CheckUser(u.Username, u.Password) {
		log.Info("User not found")
		return c.SendStatus(fiber.StatusUnauthorized)
	}

	isAdmin, err := db.GetDb(c).IsSiteAdmin(u.Username)
	if err != nil {
		log.Info("Error checking admin status:", err)
		return c.Status(500).SendString(err.Error())
	}
	// Create the Claims
	claims := jwt.MapClaims{
		"name":  u.Username,
		"admin": isAdmin,
		"exp":   time.Now().Add(time.Hour * 72).Unix(),
	}

	// Create token
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	log.Info("Token created for user:", u.Username)

	// Generate encoded token and send it as response.
	t, err := token.SignedString([]byte("secret"))
	if err != nil {
		log.Warn("Error signing token")
		return c.SendStatus(fiber.StatusInternalServerError)
	}

	println("Successfully signed token for user:", u.Username)
	return c.JSON(types.Token{Token: t})
}