package middleware

import (
	"context"
	"net/http"

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

// GetRequestIDFromContext extrait le request_id depuis le contexte Gin ou Go
// Essaie d'abord le contexte Gin, puis le contexte Go standard
func GetRequestIDFromContext(c *gin.Context) string {
	// Essayer depuis le contexte Gin
	if requestID, exists := c.Get("request_id"); exists {
		if id, ok := requestID.(string); ok && id != "" {
			return id
		}
	}
	return ""
}

// GetRequestIDFromGoContext extrait le request_id depuis un contexte Go standard
func GetRequestIDFromGoContext(ctx context.Context) string {
	// Le request_id peut être stocké dans le contexte Go avec une clé spécifique
	if requestID := ctx.Value("request_id"); requestID != nil {
		if id, ok := requestID.(string); ok {
			return id
		}
	}
	return ""
}

// PropagateRequestID ajoute le header X-Request-ID à une requête HTTP sortante
// si le request_id est disponible dans le contexte
func PropagateRequestID(c *gin.Context, req *http.Request) {
	requestID := GetRequestIDFromContext(c)
	if requestID != "" {
		req.Header.Set("X-Request-ID", requestID)
	}

	// Propager aussi le trace_id si disponible
	if traceID := GetTraceID(c); traceID != "" {
		req.Header.Set("X-Trace-ID", traceID)
	}

	// Propager aussi le span_id si disponible
	if spanID := GetSpanID(c); spanID != "" {
		req.Header.Set("X-Span-ID", spanID)
	}
}

// PropagateRequestIDFromContext ajoute le header X-Request-ID à une requête HTTP sortante
// depuis un contexte Go standard
func PropagateRequestIDFromContext(ctx context.Context, req *http.Request) {
	requestID := GetRequestIDFromGoContext(ctx)
	if requestID != "" {
		req.Header.Set("X-Request-ID", requestID)
	}

	// Propager aussi le trace_id si disponible (via tracing package)
	// Note: Cette fonctionnalité nécessiterait l'import du package tracing
	// Pour l'instant, on se concentre sur le request_id
}
