package metrics

import (
	"strings"
	"testing"
	"time"

	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/testutil"
	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
)

type fakeDBPoolSnapshotProvider struct {
	snapshot coredb.DBPoolSnapshot
}

func (provider fakeDBPoolSnapshotProvider) Snapshot() coredb.DBPoolSnapshot {
	return provider.snapshot
}

func TestRegisterDBPool(t *testing.T) {
	reg := prometheus.NewRegistry()
	provider := fakeDBPoolSnapshotProvider{
		snapshot: coredb.DBPoolSnapshot{
			Stats: coredb.DBPoolStats{
				OpenConnections: 7,
				InUse:           5,
				Idle:            2,
				WaitCount:       11,
				WaitDuration:    1500 * time.Millisecond,
			},
		},
	}

	require.NoError(t, RegisterDBPool(reg, provider))

	expected := `
# HELP agentteam_db_pool_idle Current number of idle database connections.
# TYPE agentteam_db_pool_idle gauge
agentteam_db_pool_idle 2
# HELP agentteam_db_pool_in_use Current number of database connections in use.
# TYPE agentteam_db_pool_in_use gauge
agentteam_db_pool_in_use 5
# HELP agentteam_db_pool_open_connections Current number of open database connections.
# TYPE agentteam_db_pool_open_connections gauge
agentteam_db_pool_open_connections 7
# HELP agentteam_db_pool_wait_count_total Total number of database connection waits.
# TYPE agentteam_db_pool_wait_count_total counter
agentteam_db_pool_wait_count_total 11
# HELP agentteam_db_pool_wait_duration_seconds_total Total duration spent waiting for database connections.
# TYPE agentteam_db_pool_wait_duration_seconds_total counter
agentteam_db_pool_wait_duration_seconds_total 1.5
`
	require.NoError(t, testutil.GatherAndCompare(reg, strings.NewReader(expected),
		"agentteam_db_pool_open_connections",
		"agentteam_db_pool_in_use",
		"agentteam_db_pool_idle",
		"agentteam_db_pool_wait_count_total",
		"agentteam_db_pool_wait_duration_seconds_total",
	))
}
