package service

import (
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/serverless-service/internal/config"
	"github.com/tidbcloud/serverless-service/internal/domain/constant"
	"github.com/tidbcloud/serverless-service/internal/domain/entity"
)

func TestGroupChangefeedsByClusterAndArch(t *testing.T) {
	setConfigForTest(t, &config.CentralConfig{
		CDCConfig: config.CDCConfig{NewArch: config.CDCNewArchConfig{ShareScope: "changefeed"}},
	})

	changefeeds := []*entity.CDCChangefeed{
		{
			ID:        "old",
			ClusterID: "cluster-1",
			Arch:      constant.ChangefeedArchReplicationWorker,
		},
		{
			ID:            "new",
			ClusterID:     "cluster-1",
			CloudProvider: "aws",
			Region:        "us-west-2",
			Kubernetes:    "k8s-1",
			Arch:          constant.ChangefeedArchTiCDCNewArch,
		},
		{
			ID:            "new-2",
			ClusterID:     "cluster-1",
			CloudProvider: "aws",
			Region:        "us-west-2",
			Kubernetes:    "k8s-1",
			Arch:          constant.ChangefeedArchTiCDCNewArch,
		},
	}

	worker := &cdcWorker{}
	groups := worker.groupChangefeedsByClusterArchAndShard(t.Context(), changefeeds)

	require.Len(t, groups, 3)
	require.Equal(t, []*entity.CDCChangefeed{changefeeds[0]}, groups[changefeedSyncGroupKey{
		clusterID: "cluster-1",
		arch:      constant.ChangefeedArchReplicationWorker,
	}])
	require.Equal(t, []*entity.CDCChangefeed{changefeeds[1]}, groups[changefeedSyncGroupKey{
		clusterID: "cluster-1",
		arch:      constant.ChangefeedArchTiCDCNewArch,
		shard:     resolveNewArchShard(changefeeds[1]).ClusterName,
	}])
	require.Equal(t, []*entity.CDCChangefeed{changefeeds[2]}, groups[changefeedSyncGroupKey{
		clusterID: "cluster-1",
		arch:      constant.ChangefeedArchTiCDCNewArch,
		shard:     resolveNewArchShard(changefeeds[2]).ClusterName,
	}])
}

func TestChangefeedSyncKey(t *testing.T) {
	t.Parallel()

	require.Empty(t, changefeedSyncKey(nil))
	require.Equal(t, "local-id", changefeedSyncKey(&entity.CDCChangefeed{ID: "local-id"}))
	require.Equal(t, "kernel-id", changefeedSyncKey(&entity.CDCChangefeed{
		ID:           "local-id",
		ChangefeedID: "kernel-id",
	}))
}
