package metrics

import (
	"database/sql"
	"testing"
	"time"

	"github.com/prometheus/client_golang/prometheus"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

// TestUpdateDBPoolStats vérifie que les métriques DB pool sont mises à jour
// MOD-P2-004: Test pour valider que les métriques DB pool sont exposées
func TestUpdateDBPoolStats(t *testing.T) {
	// Créer des stats de test (simule sql.DBStats)
	stats := sql.DBStats{
		OpenConnections:   5,
		InUse:             2,
		Idle:              3,
		WaitCount:         10,
		WaitDuration:      100 * time.Millisecond,
		MaxIdleClosed:     5,
		MaxIdleTimeClosed: 3,
		MaxLifetimeClosed: 2,
	}

	// Mettre à jour les métriques
	UpdateDBPoolStats(stats)

	// Vérifier que les métriques ont été enregistrées
	registry := prometheus.DefaultRegisterer.(*prometheus.Registry)
	metricFamilies, err := registry.Gather()
	require.NoError(t, err)

	// Vérifier que les métriques existent
	foundOpenConnections := false
	foundInUse := false
	foundIdle := false

	for _, mf := range metricFamilies {
		switch *mf.Name {
		case "veza_db_pool_open_connections":
			foundOpenConnections = true
			assert.GreaterOrEqual(t, len(mf.Metric), 0)
		case "veza_db_pool_in_use":
			foundInUse = true
			assert.GreaterOrEqual(t, len(mf.Metric), 0)
		case "veza_db_pool_idle":
			foundIdle = true
			assert.GreaterOrEqual(t, len(mf.Metric), 0)
		}
	}

	assert.True(t, foundOpenConnections, "veza_db_pool_open_connections metric should exist")
	assert.True(t, foundInUse, "veza_db_pool_in_use metric should exist")
	assert.True(t, foundIdle, "veza_db_pool_idle metric should exist")
}

// TestStartDBPoolStatsCollector vérifie que le collecteur démarre correctement
// MOD-P2-004: Test pour valider que le collecteur périodique fonctionne
// Note: Ce test vérifie juste que la fonction ne crash pas (ne peut pas tester le comportement périodique facilement)
func TestStartDBPoolStatsCollector(t *testing.T) {
	// Test avec nil (ne doit pas crash)
	StartDBPoolStatsCollector(nil, 100*time.Millisecond)

	// Note: Pour tester avec une vraie DB, il faudrait un driver SQLite
	// Pour l'instant, on vérifie juste que la fonction ne crash pas
	// Le comportement réel sera testé en intégration
}
