package key

import (
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/consts"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/key/task"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/key/task/alicloud"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/key/task/aws"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/key/task/common"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func TestGetKeyTasks_AWS(t *testing.T) {
	key := &v1alpha1.Key{
		ObjectMeta: metav1.ObjectMeta{
			Name:      "test-key",
			Namespace: "default",
		},
		Spec: v1alpha1.KeySpec{
			Provider: consts.ProviderTypeEKS,
			Region:   "us-west-2",
			AccountRef: v1alpha1.AccountReference{
				ProviderConfigName: "test-provider-config",
				AccountID:          "123456789012",
			},
		},
	}

	ctx := &task.Context{
		Key: key,
	}

	tasks := GetKeyTasks(nil, ctx)
	require.Len(t, tasks, 2)

	// Verify Guardian task is first
	require.Equal(t, "Guardian", tasks[0].Name())
	require.IsType(t, &common.Guardian{}, tasks[0])

	// Verify AWS Key task is second
	require.Equal(t, "Key", tasks[1].Name())
	require.IsType(t, &aws.Key{}, tasks[1])
}

func TestGetKeyTasks_ACK(t *testing.T) {
	key := &v1alpha1.Key{
		ObjectMeta: metav1.ObjectMeta{
			Name:      "test-key",
			Namespace: "default",
		},
		Spec: v1alpha1.KeySpec{
			Provider: consts.ProviderTypeACK,
			Region:   "cn-hangzhou",
			AccountRef: v1alpha1.AccountReference{
				ProviderConfigName: "test-provider-config",
				AccountID:          "123456789012",
			},
		},
	}

	ctx := &task.Context{
		Key: key,
	}

	tasks := GetKeyTasks(nil, ctx)
	require.Len(t, tasks, 2)

	// Verify Guardian task is first
	require.Equal(t, "Guardian", tasks[0].Name())
	require.IsType(t, &common.Guardian{}, tasks[0])

	// Verify ACK Key task is second
	require.Equal(t, "Key", tasks[1].Name())
	require.IsType(t, &alicloud.Key{}, tasks[1])
}

func TestGetKeyTasks_UnsupportedProvider(t *testing.T) {
	key := &v1alpha1.Key{
		ObjectMeta: metav1.ObjectMeta{
			Name:      "test-key",
			Namespace: "default",
		},
		Spec: v1alpha1.KeySpec{
			Provider: "unsupported",
			Region:   "us-west-2",
			AccountRef: v1alpha1.AccountReference{
				ProviderConfigName: "test-provider-config",
				AccountID:          "123456789012",
			},
		},
	}

	ctx := &task.Context{
		Key: key,
	}

	tasks := GetKeyTasks(nil, ctx)
	require.Nil(t, tasks)
}
