package metrics

import (
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promauto"
	"github.com/sony/gobreaker"
)

var (
	// circuitBreakerState indique l'état actuel du circuit breaker (0=closed, 1=half-open, 2=open)
	// MOD-P2-007: Métrique pour suivre l'état du circuit breaker
	circuitBreakerState = promauto.NewGaugeVec(
		prometheus.GaugeOpts{
			Name: "veza_circuit_breaker_state",
			Help: "Current state of the circuit breaker (0=closed, 1=half-open, 2=open)",
		},
		[]string{"circuit_breaker_name"},
	)

	// circuitBreakerRequestsTotal compte le nombre total de requêtes
	// MOD-P2-007: Métrique pour compter les requêtes
	circuitBreakerRequestsTotal = promauto.NewCounterVec(
		prometheus.CounterOpts{
			Name: "veza_circuit_breaker_requests_total",
			Help: "Total number of requests through the circuit breaker",
		},
		[]string{"circuit_breaker_name", "result"}, // result: success, failure, rejected
	)

	// circuitBreakerFailuresTotal compte le nombre total d'échecs
	// MOD-P2-007: Métrique pour compter les échecs
	circuitBreakerFailuresTotal = promauto.NewCounterVec(
		prometheus.CounterOpts{
			Name: "veza_circuit_breaker_failures_total",
			Help: "Total number of failures through the circuit breaker",
		},
		[]string{"circuit_breaker_name"},
	)

	// circuitBreakerConsecutiveFailures indique le nombre d'échecs consécutifs
	// MOD-P2-007: Métrique pour suivre les échecs consécutifs
	circuitBreakerConsecutiveFailures = promauto.NewGaugeVec(
		prometheus.GaugeOpts{
			Name: "veza_circuit_breaker_consecutive_failures",
			Help: "Number of consecutive failures",
		},
		[]string{"circuit_breaker_name"},
	)
)

// UpdateCircuitBreakerMetrics met à jour les métriques Prometheus pour un circuit breaker
// MOD-P2-007: Expose les métriques du circuit breaker via Prometheus
func UpdateCircuitBreakerMetrics(name string, counts gobreaker.Counts, state gobreaker.State) {
	// État du circuit breaker (0=closed, 1=half-open, 2=open)
	stateValue := 0.0
	switch state {
	case gobreaker.StateClosed:
		stateValue = 0.0
	case gobreaker.StateHalfOpen:
		stateValue = 1.0
	case gobreaker.StateOpen:
		stateValue = 2.0
	}
	circuitBreakerState.WithLabelValues(name).Set(stateValue)

	// Échecs consécutifs
	circuitBreakerConsecutiveFailures.WithLabelValues(name).Set(float64(counts.ConsecutiveFailures))

	// Total des échecs
	circuitBreakerFailuresTotal.WithLabelValues(name).Add(float64(counts.TotalFailures - counts.ConsecutiveFailures))
}

// RecordCircuitBreakerRequest enregistre une requête dans les métriques
// MOD-P2-007: Enregistre le résultat d'une requête (success, failure, rejected)
func RecordCircuitBreakerRequest(name string, result string) {
	circuitBreakerRequestsTotal.WithLabelValues(name, result).Inc()
}
