package aks

import (
	"context"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/config"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/consts"
	buckettask "github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/bucket/task"
	authv1beta1 "github.com/upbound/provider-azure/apis/authorization/v1beta1"
	storagev1beta1 "github.com/upbound/provider-azure/apis/storage/v1beta1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime"
	"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

func TestRoleAssignment_SkipsGrantForAKSBYOCStaticAuth(t *testing.T) {
	scheme := runtime.NewScheme()
	require.NoError(t, v1alpha1.AddToScheme(scheme))
	require.NoError(t, authv1beta1.AddToScheme(scheme))
	require.NoError(t, storagev1beta1.AddToScheme(scheme))

	bucket := &v1alpha1.Bucket{
		ObjectMeta: metav1.ObjectMeta{
			Name:      "bucket-cr",
			Namespace: "default",
		},
		Spec: v1alpha1.BucketSpec{
			DataplaneId: "dp-123",
			Id:          "bucket-abc",
		},
		Status: v1alpha1.BucketStatus{
			Bucket: &v1alpha1.Reference{Name: "container-1"},
		},
	}

	cli := fake.NewClientBuilder().WithScheme(scheme).Build()
	task := NewRoleAssignment(&buckettask.Context{
		Local:  cli,
		Bucket: bucket,
		Config: config.RootConfig{
			ControllerConfig: config.ControllerConfig{
				Provider: consts.ProviderTypeAKS,
			},
			BYOC: config.BYOCConfig{
				AKSControlPlaneIdentityName:         "control-plane",
				AKSKubeletIdentityName:              "kubelet",
				AKSManagedIdentityResourceGroupName: "identities-rg",
			},
		},
	})

	result := task.Create(context.Background())
	require.NoError(t, result.Error())
	assert.True(t, result.IsDoneState())

	roleAssignmentList := &authv1beta1.RoleAssignmentList{}
	require.NoError(t, cli.List(context.Background(), roleAssignmentList))
	assert.Empty(t, roleAssignmentList.Items)

	postCreateResult := task.PostCreate(context.Background())
	require.NoError(t, postCreateResult.Error())
	assert.True(t, postCreateResult.IsDoneState())
	assert.Equal(t, v1alpha1.BucketPhaseReady, bucket.Status.Phase)
}
