package legendlabels

import "testing"

func TestExtractDistinctLegendLabels(t *testing.T) {
	t.Parallel()

	testCases := []struct {
		name    string
		metrics []map[string]string
		want    []string
	}{
		{
			name: "empty input",
			want: []string{},
		},
		{
			name: "single series becomes empty",
			metrics: []map[string]string{
				{
					"__name__": "cpu_usage",
					"job":      "api",
					"instance": "a",
				},
			},
			want: []string{""},
		},
		{
			name: "keep only varying labels",
			metrics: []map[string]string{
				{
					"__name__": "cpu_usage",
					"job":      "api",
					"instance": "a",
					"cluster":  "c1",
				},
				{
					"__name__": "cpu_usage",
					"job":      "api",
					"instance": "b",
					"cluster":  "c1",
				},
			},
			want: []string{"a", "b"},
		},
		{
			name: "keep varying metric name",
			metrics: []map[string]string{
				{
					"__name__": "cpu_usage",
					"job":      "api",
				},
				{
					"__name__": "mem_usage",
					"job":      "api",
				},
			},
			want: []string{"cpu_usage", "mem_usage"},
		},
		{
			name: "differing key by absence",
			metrics: []map[string]string{
				{
					"__name__": "cpu_usage",
					"pod":      "pod-a",
				},
				{
					"__name__": "cpu_usage",
				},
			},
			want: []string{"pod-a", ""},
		},
		{
			name: "instance present removes pod fields",
			metrics: []map[string]string{
				{
					"__name__": "cpu_usage",
					"instance": "a",
					"pod":      "pod-a",
					"pod_name": "pod-name-a",
				},
				{
					"__name__": "cpu_usage",
					"instance": "b",
					"pod":      "pod-b",
					"pod_name": "pod-name-b",
				},
			},
			want: []string{"a", "b"},
		},
		{
			name: "multiple varying labels join with hyphen",
			metrics: []map[string]string{
				{
					"__name__": "cpu_usage",
					"cluster":  "c1",
					"instance": "a",
					"job":      "api",
				},
				{
					"__name__": "cpu_usage",
					"cluster":  "c2",
					"instance": "b",
					"job":      "api",
				},
			},
			want: []string{"c1 - a", "c2 - b"},
		},
		{
			name: "instance present can make label empty",
			metrics: []map[string]string{
				{
					"__name__": "cpu_usage",
					"instance": "same",
					"pod":      "pod-a",
				},
				{
					"__name__": "cpu_usage",
					"instance": "same",
					"pod":      "pod-b",
				},
			},
			want: []string{"", ""},
		},
	}

	for _, tc := range testCases {
		tc := tc
		t.Run(tc.name, func(t *testing.T) {
			t.Parallel()

			got := ExtractDistinctLegendLabels(tc.metrics)
			if len(got) != len(tc.want) {
				t.Fatalf("len(got) = %d, want %d", len(got), len(tc.want))
			}

			for i := range tc.want {
				if got[i] != tc.want[i] {
					t.Fatalf("got[%d] = %q, want %q", i, got[i], tc.want[i])
				}
			}
		})
	}
}
