package handlers

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/google/uuid"
	"go.uber.org/zap"

	"veza-backend-api/internal/middleware"
)

// CSRFHandler gère les handlers pour la protection CSRF
type CSRFHandler struct {
	csrfMiddleware *middleware.CSRFMiddleware
	logger         *zap.Logger
}

// NewCSRFHandler crée un nouveau handler CSRF
func NewCSRFHandler(csrfMiddleware *middleware.CSRFMiddleware, logger *zap.Logger) *CSRFHandler {
	return &CSRFHandler{
		csrfMiddleware: csrfMiddleware,
		logger:         logger,
	}
}

// GetCSRFToken retourne un token CSRF pour l'utilisateur authentifié
// GET /api/v1/csrf-token
func (h *CSRFHandler) GetCSRFToken() gin.HandlerFunc {
	return func(c *gin.Context) {
		// Récupérer le userID depuis le contexte (défini par AuthMiddleware)
		userIDInterface, exists := c.Get("user_id")
		if !exists {
			c.JSON(http.StatusUnauthorized, gin.H{
				"success": false,
				"error": gin.H{
					"code":    401,
					"message": "Authentication required",
				},
			})
			return
		}

		userID, ok := userIDInterface.(uuid.UUID)
		if !ok {
			h.logger.Error("Invalid user_id type in context")
			c.JSON(http.StatusInternalServerError, gin.H{
				"success": false,
				"error": gin.H{
					"code":    500,
					"message": "Internal server error",
				},
			})
			return
		}

		// Générer ou récupérer le token CSRF
		ctx := c.Request.Context()
		token, err := h.csrfMiddleware.GetToken(ctx, userID)
		if err != nil {
			h.logger.Error("Failed to get CSRF token",
				zap.Error(err),
				zap.String("user_id", userID.String()),
			)
			c.JSON(http.StatusInternalServerError, gin.H{
				"success": false,
				"error": gin.H{
					"code":    500,
					"message": "Failed to generate CSRF token",
				},
			})
			return
		}

		// Retourner le token
		c.JSON(http.StatusOK, gin.H{
			"success": true,
			"data": gin.H{
				"csrf_token": token,
			},
		})
	}
}

