package utils

import (
	"reflect"
	"testing"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/labels"
	"sigs.k8s.io/controller-runtime/pkg/client"

	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
)

func TestGetAdminNodesLabelSelector(t *testing.T) {
	tests := []struct {
		name   string
		appBox *v1alpha1.APPBox
		want   client.MatchingLabelsSelector
	}{
		{
			name: "normal",
			appBox: &v1alpha1.APPBox{
				ObjectMeta: metav1.ObjectMeta{
					Name:      "test",
					Namespace: "dedicated-prod-us-west-2",
					Labels: map[string]string{
						"tags.tidbcloud.com/environment": "prod",
						"tags.tidbcloud.com/project":     "1372813089203691283",
					},
				},
			},
			want: client.MatchingLabelsSelector{
				Selector: labels.SelectorFromSet(map[string]string{
					"tidbcloud-namespace": "dedicated-prod-us-west-2",
					"tidbcloud-appbox":    "test",
				}),
			},
		},
		{
			name: "migrated",
			appBox: &v1alpha1.APPBox{
				ObjectMeta: metav1.ObjectMeta{
					Name:      "test",
					Namespace: "dedicated-prod-us-west-2",
					Labels: map[string]string{
						"tags.tidbcloud.com/environment": "prod",
						"cloud.pingcap.com/legacy":       "true",
						"tags.tidbcloud.com/project":     "1372813089203691283",
					},
				},
				Spec: v1alpha1.APPBoxSpec{
					Region:   "us-west-2",
					Provider: "eks",
				},
			},
			want: client.MatchingLabelsSelector{
				Selector: labels.SelectorFromSet(map[string]string{
					"tidbcloud-namespace": "prod-1372813089203691283",
					"tidbcloud-network":   "eks-us-west-2",
				}),
			},
		},
		{
			name: "migrated in dev",
			appBox: &v1alpha1.APPBox{
				ObjectMeta: metav1.ObjectMeta{
					Name:      "test",
					Namespace: "dedicated-dev-us-west1",
					Labels: map[string]string{
						"tags.tidbcloud.com/environment": "dev",
						"cloud.pingcap.com/legacy":       "true",
						"tags.tidbcloud.com/project":     "3200204",
					},
				},
				Spec: v1alpha1.APPBoxSpec{
					Region:   "us-west1",
					Provider: "gke",
				},
			},
			want: client.MatchingLabelsSelector{
				Selector: labels.SelectorFromSet(map[string]string{
					"tidbcloud-namespace": "nightly-ms-3200204",
					"tidbcloud-network":   "gke-us-west1",
				}),
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := GetAdminNodesLabelSelector(tt.appBox); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("GetAdminNodesLabelSelector() = %v, want %v", got, tt.want)
			}
		})
	}
}
