package cluster

import (
	"testing"

	"github.com/stretchr/testify/require"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	openapicommonv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/common/v1beta1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/repository"
)

func TestCvtNextGenStateIncludesResourcePoolLifecycleStates(t *testing.T) {
	tests := []struct {
		input openapicommonv1beta1.ClusterState
		want  globalngv1.Cluster_State
	}{
		{input: openapicommonv1beta1.ClusterState_PAUSING, want: globalngv1.Cluster_PAUSING},
		{input: openapicommonv1beta1.ClusterState_PAUSED, want: globalngv1.Cluster_PAUSED},
		{input: openapicommonv1beta1.ClusterState_RESUMING, want: globalngv1.Cluster_RESUMING},
	}

	for _, test := range tests {
		require.Equal(t, test.want, cvtNextGenState(test.input))
	}
}

func TestMatchesNextGenStateFilter(t *testing.T) {
	filter := &repository.ClusterFilter{
		States: []entity.ClusterState{openapicommonv1beta1.ClusterState_CREATING},
	}
	require.True(t, matchesNextGenStateFilter(globalngv1.Cluster_CREATING, filter))
	require.False(t, matchesNextGenStateFilter(globalngv1.Cluster_AVAILABLE, filter))

	filter = &repository.ClusterFilter{
		ExcludeStates: []entity.ClusterState{openapicommonv1beta1.ClusterState_PAUSED},
	}
	require.True(t, matchesNextGenStateFilter(globalngv1.Cluster_CREATING, filter))
	require.False(t, matchesNextGenStateFilter(globalngv1.Cluster_PAUSED, filter))
}
