package gke

import (
	"testing"

	gkev1beta2 "github.com/crossplane-contrib/provider-gcp/apis/container/v1beta2"
)

func Test_getGCPProjectID(t *testing.T) {
	tests := []struct {
		name  string
		input string
		want  string
	}{
		{
			name:  "Normal Account",
			input: "nightly-ms--c7519123@pingcap-gardener.iam.gserviceaccount.com",
			want:  "pingcap-gardener",
		},
		{
			name:  "No At Character",
			input: "nightly-ms--c7519123pingcap-gardener.iam.gserviceaccount.com",
			want:  "",
		},
		{
			name:  "No Dot After At",
			input: "nightly-ms--c7523@pingcap-gardeneriamgserviceaccountcom",
			want:  "",
		},
		{
			name:  "empty string",
			input: "",
			want:  "",
		},
		{
			name:  "random string",
			input: "adshfjashdfjkhajdfhj",
			want:  "",
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := getGCPProjectID(tt.input); got != tt.want {
				t.Errorf("getGCPProjectID() = %v, want %v", got, tt.want)
			}
		})
	}
}

func Test_getAdminNodePoolName(t *testing.T) {
	tests := []struct {
		name string
		gke  *gkev1beta2.Cluster
		want string
	}{
		{
			name: "no node pools",
			gke: &gkev1beta2.Cluster{
				Status: gkev1beta2.ClusterStatus{
					AtProvider: gkev1beta2.ClusterObservation{
						NodePools: nil,
					},
				},
			},
		},
		{
			name: "with node group type label",
			gke: &gkev1beta2.Cluster{
				Status: gkev1beta2.ClusterStatus{
					AtProvider: gkev1beta2.ClusterObservation{
						NodePools: []*gkev1beta2.NodePoolClusterStatus{
							{
								Config: &gkev1beta2.NodeConfigClusterStatus{
									Labels: map[string]string{
										"cloud.pingcap.com/node-group-type": "control-plane",
									},
								},
								Name: "admin",
							},
							{
								Config: &gkev1beta2.NodeConfigClusterStatus{
									Labels: map[string]string{"cloud.pingcap.com/node-group-type": "data-plane"},
								},
								Name: "other",
							},
						},
					},
				},
			},
			want: "admin",
		},
		{
			name: "with usedby label",
			gke: &gkev1beta2.Cluster{
				Status: gkev1beta2.ClusterStatus{
					AtProvider: gkev1beta2.ClusterObservation{
						NodePools: []*gkev1beta2.NodePoolClusterStatus{
							{
								Config: &gkev1beta2.NodeConfigClusterStatus{
									Labels: map[string]string{"usedby": "dbaas-control-plane-shoot"},
								},
								Name: "admin",
							},
							{
								Config: &gkev1beta2.NodeConfigClusterStatus{
									Labels: map[string]string{"usedby": "customer-tidb"},
								},
								Name: "other",
							},
						},
					},
				},
			},
			want: "admin",
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := getAdminNodePoolName(tt.gke); got != tt.want {
				t.Errorf("getAdminNodePoolName() = %v, want %v", got, tt.want)
			}
		})
	}
}
