package user

import (
	"veza-backend-api/internal/middleware"

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

// RouteGroup représente un groupe de routes pour le module utilisateur
type RouteGroup struct {
	handler        *Handler
	secret         string
	authMiddleware *middleware.AuthMiddleware // Added authMiddleware
}

// NewRouteGroup crée une nouvelle instance de RouteGroup
func NewRouteGroup(handler *Handler, jwtSecret string, authMiddleware *middleware.AuthMiddleware) *RouteGroup { // Added authMiddleware parameter
	return &RouteGroup{
		handler:        handler,
		secret:         jwtSecret,
		authMiddleware: authMiddleware, // Assign authMiddleware
	}
}

// Register enregistre toutes les routes du module utilisateur
func (rg *RouteGroup) Register(router *gin.RouterGroup) {
	// Groupe principal des utilisateurs
	users := router.Group("/users")
	{
		// Routes publiques
		rg.registerPublicRoutes(users)

		// Routes protégées
		rg.registerProtectedRoutes(users)
	}
}

// registerPublicRoutes enregistre les routes publiques
func (rg *RouteGroup) registerPublicRoutes(router *gin.RouterGroup) {
	// GET /api/v1/users - Liste des utilisateurs
	router.GET("", rg.handler.GetUsers)

	// GET /api/v1/users/:id/avatar - Avatar d'un utilisateur
	router.GET("/:id/avatar", rg.handler.GetUserAvatar)

	// POST /api/v1/users/recover - Récupérer un compte supprimé
	router.POST("/recover", rg.handler.RecoverAccount)
}

// registerProtectedRoutes enregistre les routes protégées
func (rg *RouteGroup) registerProtectedRoutes(router *gin.RouterGroup) {
	protected := router.Group("")
	protected.Use(rg.authMiddleware.RequireAuth()) // Changed to RequireAuth()
	{
		// GET /api/v1/users/me - Informations de l'utilisateur connecté
		protected.GET("/me", rg.handler.GetMe)

		// PUT /api/v1/users/me - Mise à jour des informations de l'utilisateur
		protected.PUT("/me", rg.handler.UpdateMe)

		// PUT /api/v1/users/me/password - Changement de mot de passe
		protected.PUT("/me/password", rg.handler.ChangePassword)

		// GET /api/v1/users/me/preferences - Récupérer les préférences
		protected.GET("/me/preferences", rg.handler.GetPreferences)

		// PUT /api/v1/users/me/preferences - Mettre à jour les préférences
		protected.PUT("/me/preferences", rg.handler.UpdatePreferences)

		// DELETE /api/v1/users/me - Supprimer le compte
		protected.DELETE("/me", rg.handler.DeleteAccount)

		// GET /api/v1/users/me/status - Statut du compte
		protected.GET("/me/status", rg.handler.GetAccountStatus)

		// GET /api/v1/users/me/export - Exporter les données (RGPD)
		protected.GET("/me/export", rg.handler.ExportData)

		// POST /api/v1/users/me/request-deletion - Demander suppression définitive
		protected.POST("/me/request-deletion", rg.handler.RequestDataDeletion)

		// GET /api/v1/users/except-me - Liste des utilisateurs sauf l'utilisateur connecté
		protected.GET("/except-me", rg.handler.GetUsersExceptMe)

		// GET /api/v1/users/search - Recherche d'utilisateurs
		protected.GET("/search", rg.handler.SearchUsers)
	}
}

// SetupRoutes configure les routes du module utilisateur (pour la compatibilité)
// func SetupRoutes(router *gin.RouterGroup, handler *Handler, jwtSecret string) {
// 	rg := NewRouteGroup(handler, jwtSecret)
// 	rg.Register(router)
// }
