package k8scliv2

import (
	"testing"

	"github.com/stretchr/testify/assert"
	gkev1beta2 "github.com/upbound/provider-gcp/apis/container/v1beta2"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/rest"
	"k8s.io/utils/ptr"
)

func TestGkeTenantClientManager_GetConfig(t *testing.T) {
	clusterName := "test-gke"
	endpoint := "1.2.3.4"

	tests := []getConfigTestCase{
		{
			name: "returns config for existing cluster",
			cluster: &gkev1beta2.Cluster{
				ObjectMeta: metav1.ObjectMeta{
					Name: clusterName,
				},
				Status: gkev1beta2.ClusterStatus{
					AtProvider: gkev1beta2.ClusterObservation{
						Endpoint: ptr.To(endpoint),
					},
				},
			},
			verify: func(t *testing.T, cfg *rest.Config) {
				assert.NotNil(t, cfg)
				assert.Equal(t, "https://"+endpoint, cfg.Host)
				assert.True(t, cfg.TLSClientConfig.Insecure)

				assert.NotNil(t, cfg.ExecProvider)
				assert.Equal(t, "client.authentication.k8s.io/v1beta1", cfg.ExecProvider.APIVersion)
				assert.Equal(t, "gke-gcloud-auth-plugin", cfg.ExecProvider.Command)
				assert.Contains(t, cfg.ExecProvider.Args, "--use_application_default_credentials")
			},
		},
		{
			name:    "returns error when cluster is not found",
			cluster: nil,
			wantErr: true,
			errMsg:  "not found",
		},
	}

	runGetConfigTests(t, tests, clusterName, NewGKETenantClientManager)
}

func TestGkeTenantClientManager_GetClient(t *testing.T) {
	clusterName := "test-gke"
	endpoint := "1.2.3.4"

	tests := []getClientTestCase{
		{
			name: "returns client or exec plugin error for valid config",
			cluster: &gkev1beta2.Cluster{
				ObjectMeta: metav1.ObjectMeta{Name: clusterName},
				Status: gkev1beta2.ClusterStatus{
					AtProvider: gkev1beta2.ClusterObservation{Endpoint: ptr.To(endpoint)},
				},
			},
			wantErr: false,
		},
		{
			name:    "returns error when config lookup fails",
			cluster: nil,
			wantErr: true,
			errMsg:  "not found",
		},
	}

	runGetClientTests(t, tests, clusterName, NewGKETenantClientManager, "GetClient")
	runGetClientTests(t, tests, clusterName, NewGKETenantClientManager, "GetMetricsClient")
}
