package middleware

import (
	"strconv"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promauto"
)

var (
	// httpRequestsTotal compte le total de requêtes HTTP par méthode, path et status
	httpRequestsTotal = promauto.NewCounterVec(
		prometheus.CounterOpts{
			Name: "veza_gin_http_requests_total",
			Help: "Total number of HTTP requests (Gin middleware)",
		},
		[]string{"method", "path", "status"},
	)

	// httpRequestDuration mesure la durée des requêtes HTTP
	httpRequestDuration = promauto.NewHistogramVec(
		prometheus.HistogramOpts{
			Name:    "veza_gin_http_request_duration_seconds",
			Help:    "HTTP request duration in seconds (Gin middleware)",
			Buckets: prometheus.DefBuckets,
		},
		[]string{"method", "path", "status"},
	)
)

// Metrics middleware pour collecter métriques HTTP
// Mesure la durée et compte les requêtes HTTP avec labels (method, path, status)
func Metrics() gin.HandlerFunc {
	return func(c *gin.Context) {
		start := time.Now()
		path := c.FullPath()
		if path == "" {
			path = c.Request.URL.Path
		}

		c.Next()

		duration := time.Since(start).Seconds()
		status := strconv.Itoa(c.Writer.Status())
		method := c.Request.Method

		httpRequestsTotal.WithLabelValues(method, path, status).Inc()
		httpRequestDuration.WithLabelValues(method, path, status).Observe(duration)
	}
}
