package metrics

import (
	"testing"

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

	inframetrics "github.com/tidbcloud/aisupport/packages/sdk-go/infra/metrics"
)

func TestInitMetrics(t *testing.T) {
	registry := prometheus.NewRegistry()
	originalRegisterer := prometheus.DefaultRegisterer
	originalGatherer := prometheus.DefaultGatherer
	prometheus.DefaultRegisterer = registry
	prometheus.DefaultGatherer = registry
	t.Cleanup(func() {
		prometheus.DefaultRegisterer = originalRegisterer
		prometheus.DefaultGatherer = originalGatherer
		inframetrics.RPC = nil
		inframetrics.ServiceEventJob = nil
		inframetrics.ServiceCronJob = nil
	})

	InitMetrics()

	require.NotNil(t, inframetrics.RPC)
	require.NotNil(t, inframetrics.ServiceEventJob)
	require.NotNil(t, inframetrics.ServiceCronJob)

	inframetrics.RPC.ReqDur.WithLabelValues("OK", "/agent.gateway.agent.v1.AgentService/ListProjects").Observe(0.1)
	inframetrics.RPC.RespSize.Observe(128)
	inframetrics.ServiceEventJob.SyncCount.WithLabelValues("TaskService", "DeliverEvent", "success").Inc()
	inframetrics.ServiceEventJob.SyncDur.WithLabelValues("TaskService", "DeliverEvent", "success").Observe(0.1)
	inframetrics.ServiceCronJob.SyncCount.WithLabelValues("TaskService", "RetryDelivery", "failed").Inc()
	inframetrics.ServiceCronJob.SyncDur.WithLabelValues("TaskService", "RetryDelivery", "failed").Observe(0.1)

	families, err := registry.Gather()
	require.NoError(t, err)
	names := make([]string, 0, len(families))
	for _, family := range families {
		names = append(names, family.GetName())
	}
	require.ElementsMatch(t, []string{
		"agent_gateway_cron_job_sync_count_total",
		"agent_gateway_cron_job_sync_duration_seconds",
		"agent_gateway_event_job_sync_count_total",
		"agent_gateway_event_job_sync_duration_seconds",
		"agent_gateway_rpc_request_duration_seconds",
		"agent_gateway_rpc_response_size_bytes",
	}, names)
}
