package managerserver

import (
	"testing"

	"github.com/prometheus/client_golang/prometheus"
	dto "github.com/prometheus/client_model/go"
	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/aws-shared-provider/pkg/metrics"
)

func TestTiDBActiveDurationMetric(t *testing.T) {
	const poolNamespace = "tidb-pool"

	metrics.TiDBActiveDurationHistogram.Reset()
	activeSeconds, valid := parseTiDBActiveSeconds("42")
	require.True(t, valid)
	metrics.TiDBActiveDurationHistogram.WithLabelValues(poolNamespace).Observe(activeSeconds)
	observer, err := metrics.TiDBActiveDurationHistogram.GetMetricWithLabelValues(poolNamespace)
	require.NoError(t, err)
	metric := &dto.Metric{}
	require.NoError(t, observer.(prometheus.Metric).Write(metric))
	require.Equal(t, uint64(1), metric.GetHistogram().GetSampleCount())
	require.Equal(t, float64(42), metric.GetHistogram().GetSampleSum())
}

func TestParseTiDBActiveSeconds(t *testing.T) {
	tests := []struct {
		name      string
		value     string
		want      float64
		wantValid bool
	}{
		{name: "missing", value: "", wantValid: false},
		{name: "valid", value: "42", want: 42, wantValid: true},
		{name: "zero", value: "0", want: 0, wantValid: true},
		{name: "negative", value: "-1", wantValid: false},
		{name: "fractional", value: "1.5", wantValid: false},
		{name: "text", value: "invalid", wantValid: false},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, valid := parseTiDBActiveSeconds(tt.value)
			require.Equal(t, tt.wantValid, valid)
			require.Equal(t, tt.want, got)
		})
	}
}
