package service

import (
	"testing"

	dto "dataservices/internal/dto/dataapi"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/core-svc/idl/pbgen/proto/core"
	"github.com/tidbcloud/dataservices/idl/pbgen/proto/dataapi"
)

func TestUsesProviderScopedRegionalHost(t *testing.T) {
	require.False(t, usesProviderScopedRegionalHost(nil))
	require.False(t, usesProviderScopedRegionalHost(&core.Cluster{
		CloudProviderName: "aws",
		DeployType:        core.DeployType_DEPLOY_TYPE_SHARED,
	}))
	require.True(t, usesProviderScopedRegionalHost(&core.Cluster{
		CloudProviderName: "alicloud",
		DeployType:        core.DeployType_DEPLOY_TYPE_DEDICATED,
	}))
	require.True(t, usesProviderScopedRegionalHost(&core.Cluster{
		CloudProviderName: "alicloud",
		DeployType:        core.DeployType_DEPLOY_TYPE_SHARED,
	}))
}

func TestUsesProviderScopedRegionalHostForAppClusters(t *testing.T) {
	appClusters := []dto.AppClusterInfo{
		{Cloud: "aws", TierType: core.DeployType_DEPLOY_TYPE_SHARED.String(), RegionCode: "us-west-2"},
		{Cloud: "alicloud", TierType: core.DeployType_DEPLOY_TYPE_SHARED.String(), RegionCode: "cn-hangzhou"},
	}

	require.True(t, usesProviderScopedRegionalHostForAppClusters(appClusters, ""))
	require.True(t, usesProviderScopedRegionalHostForAppClusters(appClusters, "cn-hangzhou"))
	require.False(t, usesProviderScopedRegionalHostForAppClusters(appClusters, "us-west-2"))
}

func TestGuardRegionalCapabilityForCluster(t *testing.T) {
	awsShared := &core.Cluster{CloudProviderName: "aws", DeployType: core.DeployType_DEPLOY_TYPE_SHARED}
	aliShared := &core.Cluster{CloudProviderName: "alicloud", DeployType: core.DeployType_DEPLOY_TYPE_SHARED}

	require.NoError(t, GuardRegionalCapabilityForCluster(awsShared, RegionalCapabilityCustomDomain))
	require.NoError(t, GuardRegionalCapabilityForCluster(awsShared, RegionalCapabilityDataSourceBinding))
	require.NoError(t, GuardRegionalCapabilityForCluster(aliShared, RegionalCapabilitySQLMainChain))
	require.ErrorContains(t, GuardRegionalCapabilityForCluster(aliShared, RegionalCapabilityDataAppMetrics), "dataapp metrics is unsupported for alicloud serverless")
	require.ErrorContains(t, GuardRegionalCapabilityForCluster(aliShared, RegionalCapabilityDataSourceBinding), "data source binding is unsupported for alicloud serverless")
}

func TestShouldSkipClusterCreateSync(t *testing.T) {
	require.False(t, shouldSkipClusterCreateSync(nil))
	require.False(t, shouldSkipClusterCreateSync(&core.Cluster{
		CloudProviderName: "aws",
		DeployType:        core.DeployType_DEPLOY_TYPE_SHARED,
	}))
	require.True(t, shouldSkipClusterCreateSync(&core.Cluster{
		CloudProviderName: "alicloud",
		DeployType:        core.DeployType_DEPLOY_TYPE_DEDICATED,
	}))
	require.True(t, shouldSkipClusterCreateSync(&core.Cluster{
		CloudProviderName: "alicloud",
		DeployType:        core.DeployType_DEPLOY_TYPE_SHARED,
	}))
}

func TestGetProviderScopedClusterStatus(t *testing.T) {
	require.Equal(t, dataapi.ClusterStatus_Unsupported, getProviderScopedClusterStatus(nil))
	require.Equal(t, dataapi.ClusterStatus_Normal, getProviderScopedClusterStatus(&core.Cluster{
		UserStatus: core.UserClusterStatus_USER_CLUSTER_STATUS_NORMAL,
	}))
	require.Equal(t, dataapi.ClusterStatus_Normal, getProviderScopedClusterStatus(&core.Cluster{
		UserStatus: core.UserClusterStatus_USER_CLUSTER_STATUS_IMPORTING,
	}))
	require.Equal(t, dataapi.ClusterStatus_Creating, getProviderScopedClusterStatus(&core.Cluster{
		UserStatus: core.UserClusterStatus_USER_CLUSTER_STATUS_CREATING,
	}))
	require.Equal(t, dataapi.ClusterStatus_Creating, getProviderScopedClusterStatus(&core.Cluster{
		UserStatus: core.UserClusterStatus_USER_CLUSTER_STATUS_SCALING,
	}))
	require.Equal(t, dataapi.ClusterStatus_Creating, getProviderScopedClusterStatus(&core.Cluster{
		UserStatus: core.UserClusterStatus_USER_CLUSTER_STATUS_UPGRADING,
	}))
	require.Equal(t, dataapi.ClusterStatus_Creating, getProviderScopedClusterStatus(&core.Cluster{
		UserStatus: core.UserClusterStatus_USER_CLUSTER_STATUS_RECOVERING,
	}))
	require.Equal(t, dataapi.ClusterStatus_Creating, getProviderScopedClusterStatus(&core.Cluster{
		UserStatus: core.UserClusterStatus_USER_CLUSTER_STATUS_RESUMING,
	}))
	require.Equal(t, dataapi.ClusterStatus_Unsupported, getProviderScopedClusterStatus(&core.Cluster{
		UserStatus: core.UserClusterStatus_USER_CLUSTER_STATUS_PAUSED,
	}))
}
