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/test/testdata"
	"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"
	"sigs.k8s.io/controller-runtime/pkg/client/fake"
	"sigs.k8s.io/yaml"
)

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

	t.Run("test collect", func(t *testing.T) {
		cli := fake.NewClientBuilder().WithScheme(s).WithObjects(vpcs()...).Build()
		c := &vpc{cli, ctrl.Log}
		testCh := make(chan prometheus.Metric, 10)
		c.Collect(testCh)
		g.Expect(len(vpcs()), Equal(len(testCh)))
		m := <-testCh
		out := &dto.Metric{}
		m.Write(out)
		for _, p := range out.GetLabel() {
			k, v := *p.Name, *p.Value
			switch k {
			case "name":
				g.Expect(v, Equal("foo"))
			case "vpc_id":
				g.Expect(v, Equal("foo"))
			case "cidr":
				g.Expect(v, Equal("10.10.0.0/16"))
			case "tenant_id":
				g.Expect(v, Equal("foo"))
			case "project_id":
				g.Expect(v, Equal("foo"))
			case "account":
				g.Expect(v, Equal("foo"))
			}
		}
	})
}

func vpcs() []client.Object {
	data, _ := testdata.LoadDefaultVPCYAML()
	fakeVPC := &v1alpha1.VPC{}
	yaml.Unmarshal(data, fakeVPC)
	fakeVPC2 := fakeVPC.DeepCopy()
	fakeVPC2.Name = "test-bar"

	return []client.Object{
		fakeVPC,
		fakeVPC2,
	}
}
