package keyspacerole

import (
	"testing"

	"github.com/stretchr/testify/require"
	apiv1 "github.com/tidbcloud/cluster-service-ng/api/cluster-service-ng/v1beta"
	"github.com/tidbcloud/cluster-service-ng/domain/entity"
)

func TestBuildParamsNormalizesStoragePrefix(t *testing.T) {
	params, err := BuildParams(&entity.SharedPool{
		SharedPool: apiv1.SharedPool{
			Id:            "sp-1",
			DataplaneName: "dp-1",
			Provider:      &apiv1.Provider{Type: apiv1.ProviderType_AWS},
			InternalStorage: &apiv1.SharedPool_ObjectStorage{
				Prefix: " /internal/prefix/ ",
				Region: "us-east-1",
			},
		},
	}, &entity.TiDBCluster{Id: "cluster-1"}, "")

	require.NoError(t, err)
	require.Equal(t, "internal/prefix/cluster-1", params.AllowedPrefix)
}

func TestBuildParamsUsesClusterIDWhenStoragePrefixIsEmpty(t *testing.T) {
	params, err := BuildParams(&entity.SharedPool{
		SharedPool: apiv1.SharedPool{
			Id:            "sp-1",
			DataplaneName: "dp-1",
			Provider:      &apiv1.Provider{Type: apiv1.ProviderType_AWS},
			InternalStorage: &apiv1.SharedPool_ObjectStorage{
				Region: "us-east-1",
			},
		},
	}, &entity.TiDBCluster{Id: "cluster-1"}, "")

	require.NoError(t, err)
	require.Equal(t, "cluster-1", params.AllowedPrefix)
}

func TestBuildParamsUsesClusterIDForTopologyDrivenClusterWithoutTiDBWorker(t *testing.T) {
	params, err := BuildParams(&entity.SharedPool{
		SharedPool: apiv1.SharedPool{
			Id:            "sp-1",
			DataplaneName: "dp-1",
			CapacityMode:  apiv1.CapacityMode_TOPOLOGY_DRIVEN,
			Provider:      &apiv1.Provider{Type: apiv1.ProviderType_AWS},
			InternalStorage: &apiv1.SharedPool_ObjectStorage{
				Prefix: "internal/prefix",
				Region: "us-east-1",
			},
		},
	}, &entity.TiDBCluster{Id: "cluster-1"}, "")

	require.NoError(t, err)
	require.Equal(t, "cluster-1", params.KeyspaceName)
	require.Equal(t, "cluster-1", params.ExternalID)
	require.Equal(t, "internal/prefix/cluster-1", params.AllowedPrefix)
}

func TestBuildParamsUsesClusterIDForTopologyDrivenClusterWithTiDBWorker(t *testing.T) {
	params, err := BuildParams(&entity.SharedPool{
		SharedPool: apiv1.SharedPool{
			Id:            "sp-1",
			DataplaneName: "dp-1",
			CapacityMode:  apiv1.CapacityMode_TOPOLOGY_DRIVEN,
			Provider:      &apiv1.Provider{Type: apiv1.ProviderType_AWS},
			InternalStorage: &apiv1.SharedPool_ObjectStorage{
				Prefix: "internal/prefix",
				Region: "us-east-1",
			},
			ComponentGroups: []*apiv1.Component{{
				ComponentType: apiv1.ComponentType_TIDB_WORKER,
				NodeQuota:     &apiv1.NodeQuota{NodeCount: 1},
			}},
		},
	}, &entity.TiDBCluster{Id: "cluster-1"}, "")

	require.NoError(t, err)
	require.Equal(t, "cluster-1", params.KeyspaceName)
	require.Equal(t, "cluster-1", params.ExternalID)
	require.Equal(t, "internal/prefix/cluster-1", params.AllowedPrefix)
}
