package component

import (
	"reflect"
	"testing"

	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	rsconfig "github.com/tidbcloud/infra-provider/regional-server/pkg/config"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/labels"
)

func TestBuildCacheSelectorIncludesServerReadObjects(t *testing.T) {
	cacheSelector, err := buildCacheSelector(rsconfig.RootConfig{
		Predicate: metav1.LabelSelector{
			MatchLabels: map[string]string{
				v1alpha1.RegionKey: "test-region",
				v1alpha1.ManageKey: "dataplane-manager",
			},
		},
	})
	if err != nil {
		t.Fatalf("build cache selector: %v", err)
	}

	expectedObjects := map[string]struct{}{
		"DataPlane":    {},
		"APPBox":       {},
		"NodePool":     {},
		"VPC":          {},
		"VPCPeering":   {},
		"Internet":     {},
		"LoadBalancer": {},
	}

	if len(cacheSelector) != len(expectedObjects) {
		t.Fatalf("expected %d cache objects, got %d", len(expectedObjects), len(cacheSelector))
	}

	for obj, byObject := range cacheSelector {
		objectName := reflect.TypeOf(obj).Elem().Name()
		if _, ok := expectedObjects[objectName]; !ok {
			t.Fatalf("unexpected cache object %q", objectName)
		}

		if !byObject.Label.Matches(labels.Set{
			v1alpha1.RegionKey: "test-region",
			v1alpha1.ManageKey: "dataplane-manager",
		}) {
			t.Fatalf("cache selector for %q does not match expected labels", objectName)
		}
		if byObject.Label.Matches(labels.Set{
			v1alpha1.RegionKey: "other-region",
			v1alpha1.ManageKey: "dataplane-manager",
		}) {
			t.Fatalf("cache selector for %q matches unexpected region", objectName)
		}
		delete(expectedObjects, objectName)
	}

	if len(expectedObjects) != 0 {
		t.Fatalf("missing cache objects: %v", expectedObjects)
	}
}
