package collectors

import (
	"testing"

	. "github.com/onsi/gomega"
	"github.com/prometheus/client_golang/prometheus"
	dto "github.com/prometheus/client_model/go"
	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/consts"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime"
	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
	ctrl "sigs.k8s.io/controller-runtime"
	"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

func TestPrivateLinkEndpointCollect(t *testing.T) {
	s := runtime.NewScheme()
	utilruntime.Must(v1alpha1.SchemeBuilder.AddToScheme(s))
	g := NewWithT(t)

	ple := &v1alpha1.PrivateLinkEndpoint{
		ObjectMeta: metav1.ObjectMeta{
			Name: "ple-1",
			Labels: map[string]string{
				consts.TenantLabelKey: "tenant-1",
			},
		},
		Spec: v1alpha1.PrivateLinkEndpointSpec{
			Provider: "aws",
			Region:   "us-east-1",
			VPCRef: v1alpha1.Reference{
				Name: "vpc-1",
			},
		},
		Status: v1alpha1.PrivateLinkEndpointStatus{
			Phase: v1alpha1.PrivateLinkEndpointPhaseCreating,
		},
	}

	cli := fake.NewClientBuilder().WithScheme(s).WithObjects(ple).Build()
	c := &privateLinkEndpoint{cli, ctrl.Log}
	testCh := make(chan prometheus.Metric, 1)

	c.Collect(testCh)

	g.Expect(testCh).To(HaveLen(1))
	labels := metricLabels(<-testCh)
	g.Expect(labels).To(Equal(map[string]string{
		"name":      "ple-1",
		"tenant_id": "tenant-1",
		"region":    "us-east-1",
		"provider":  "aws",
		"vpc":       "vpc-1",
		"status":    "Creating",
	}))
}

func metricLabels(metric prometheus.Metric) map[string]string {
	out := &dto.Metric{}
	_ = metric.Write(out)

	labels := make(map[string]string, len(out.GetLabel()))
	for _, label := range out.GetLabel() {
		labels[label.GetName()] = label.GetValue()
	}
	return labels
}
