package middlewares

import (
	"fmt"

	"github.com/sujit-baniya/fiber-boilerplate/utils"

	"github.com/gofiber/fiber/v2"
	"github.com/gookit/validate"
	"github.com/sujit-baniya/fiber-boilerplate/app"
	"github.com/sujit-baniya/fiber-boilerplate/pkg/auth"
	"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
)

func ValidateRegisterPost(c *fiber.Ctx) error {
	// Declara el modelo RegisterForm
	var register models.RegisterForm

	// Intenta parsear el cuerpo de la solicitud
	if err := c.BodyParser(&register); err != nil {
		return app.Http.Flash.WithError(c, fiber.Map{
			"message": "Error al procesar los datos del formulario: " + err.Error(),
		}).Redirect("/register-gas")
	}

	// Realiza la validación del formulario
	v := validate.Struct(register)
	if v == nil {
		return app.Http.Flash.WithError(c, fiber.Map{
			"message": "Error en la validación de los datos del formulario.",
		}).Redirect("/register-gas")
	}

	// Verifica si hay errores de validación
	if !v.Validate() {
		errorMessage := "Error desconocido en los datos del formulario."
		if len(v.Errors) > 0 {
			errorMessage = v.Errors.One() // Obtiene el primer error si existe
		}
		return app.Http.Flash.WithError(c, fiber.Map{
			"message": errorMessage,
		}).Redirect("/register-gas")
	}

	return c.Next()
}

func ValidateConfirmToken(c *fiber.Ctx) error {
	t := utils.Decrypt(c.Query("t"), app.Http.Server.Key)
	fmt.Println(t)
	user, err := models.GetUserByUsuarioVerify(t)
	if err != nil {
		return app.Http.Flash.WithError(c, fiber.Map{
			"message": err.Error(),
		}).Redirect("/login")
	}

	if user.EmailVerified {
		return app.Http.Flash.WithError(c, fiber.Map{
			"message": "Usuario was already validated",
		}).Redirect("/login")
	}
	user.EmailVerified = true
	app.Http.Database.DB.Save(&user)

	auth.Login(c, user.ID, app.Http.Server.Key) //nolint:wsl
	c.Locals("user", user)
	return c.Next()
}
