package vo

import (
	"testing"

	"github.com/stretchr/testify/require"
	console "github.com/tidbcloud/serverless-service/idl/pbgen/proto/console"
	"github.com/tidbcloud/serverless-service/idl/pbgen/proto/v1beta1"
	"github.com/tidbcloud/serverless-service/internal/domain/constant"
	"github.com/tidbcloud/serverless-service/internal/domain/entity"
)

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

	require.Equal(t, v1beta1.ChangefeedState_DELETING, convertCDCStateToV1beta1(constant.ChangefeedStateDeleting))
	require.Equal(t, console.ChangefeedState_DELETING, convertCDCStateToConsole(constant.ChangefeedStateDeleting))
	require.Equal(t, v1beta1.ChangefeedState_DELETED, convertCDCStateToV1beta1(constant.ChangefeedStateDeleted))
	require.Equal(t, console.ChangefeedState_DELETED, convertCDCStateToConsole(constant.ChangefeedStateDeleted))
}

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

	info := &entity.CloudStorageInfo{}
	require.Nil(t, convertCloudStorageInfoToV1beta1(info))
	require.Nil(t, convertCloudStorageInfoToConsole(info))
}

func TestConvertCloudStorageInfoPreservesOutputColumnID(t *testing.T) {
	info := &entity.CloudStorageInfo{
		CloudStorage:   &entity.CloudStorage{},
		OutputColumnID: true,
	}
	require.True(t, convertCloudStorageInfoToV1beta1(info).OutputColumnId)
	require.True(t, convertCloudStorageInfoToConsole(info).OutputColumnId)
}

func TestConvertCDCFilterPreservesRecoveryFields(t *testing.T) {
	bdrMode := false
	filter := &entity.CDCFilter{
		FilterRule:       []string{"*.*"},
		IgnoreTxnStartTs: []uint64{123, 456},
		BDRMode:          &bdrMode,
	}

	v1Filter := convertCDCFilterToV1beta1(filter)
	require.Equal(t, filter.IgnoreTxnStartTs, v1Filter.IgnoreTxnStartTs)
	require.NotNil(t, v1Filter.BdrMode)
	require.False(t, v1Filter.GetBdrMode())

	consoleFilter := convertCDCFilterToConsole(filter)
	require.Equal(t, filter.IgnoreTxnStartTs, consoleFilter.IgnoreTxnStartTs)
	require.NotNil(t, consoleFilter.BdrMode)
	require.False(t, consoleFilter.GetBdrMode())
}
