package regionalapi

import (
	"encoding/json"
	"testing"

	"github.com/aws/smithy-go/ptr"
	v2 "github.com/pingcap/tiflow/cdc/api/v2"
	"github.com/pingcap/tiflow/pkg/config"
	"github.com/pingcap/tiflow/pkg/util"
	"github.com/stretchr/testify/require"
	ticdc_v1 "github.com/tidbcloud/infra-provider/api/tidbcloud/ticdc-service/v1"
	"google.golang.org/protobuf/encoding/protojson"
)

var customReplicaConfig = &v2.ReplicaConfig{
	MemoryQuota:           1123450,
	CaseSensitive:         false,
	ForceReplicate:        false,
	IgnoreIneligibleTable: false,
	CheckGCSafePoint:      false,
	BDRMode:               util.AddressOf(false),
	EnableSyncPoint:       util.AddressOf(false),
	//SyncPointInterval:     util.AddressOf(JSONDuration{duration: 10 * time.Minute}),
	//SyncPointRetention:    util.AddressOf(JSONDuration{duration: 24 * time.Hour}),
	Filter: &v2.FilterConfig{
		IgnoreTxnStartTs: []uint64{1, 2, 3},
		EventFilters: []v2.EventFilterRule{{
			Matcher:                  []string{"test.worker"},
			IgnoreEvent:              []string{"update"},
			IgnoreSQL:                []string{"^drop", "add column"},
			IgnoreInsertValueExpr:    "id >= 100",
			IgnoreUpdateNewValueExpr: "gender = 'male'",
			IgnoreUpdateOldValueExpr: "age < 18",
			IgnoreDeleteValueExpr:    "id > 100",
		}},
		Rules: []string{
			"a.d", "b.x",
		},
	},
	Mounter: &v2.MounterConfig{
		WorkerNum: 17,
	},
	Sink: &v2.SinkConfig{
		Protocol: ptr.String("arvo"),
		ColumnSelectors: []*v2.ColumnSelector{
			{
				[]string{"a.b"},
				[]string{"c"},
			},
		},
		TxnAtomicity: ptr.String("table"),
		Terminator:   ptr.String("a"),
		CSVConfig: &v2.CSVConfig{
			Quote:          string(config.DoubleQuoteChar),
			Delimiter:      config.Comma,
			NullString:     config.NULL,
			OutputOldValue: true,
		},
		DateSeparator:               ptr.String("day"),
		EncoderConcurrency:          util.AddressOf(32),
		EnablePartitionSeparator:    util.AddressOf(true),
		ContentCompatible:           util.AddressOf(true),
		SendBootstrapIntervalInSec:  util.AddressOf(int64(120)),
		SendBootstrapInMsgCount:     util.AddressOf(int32(10000)),
		SendBootstrapToAllPartition: util.AddressOf(true),
		DebeziumDisableSchema:       util.AddressOf(true),
		OpenProtocolConfig:          &v2.OpenProtocolConfig{OutputOldValue: true},
		DebeziumConfig:              &v2.DebeziumConfig{OutputOldValue: true},
		DispatchRules: []*v2.DispatchRule{
			{
				Matcher:       []string{"a.b"},
				PartitionRule: "index-value",
				IndexName:     "inx",
				Columns:       []string{"ab"},
				TopicRule:     "aa",
			},
		},
	},
	Scheduler: &v2.ChangefeedSchedulerConfig{
		EnableTableAcrossNodes: false,
		RegionThreshold:        13,
	},
	Integrity: &v2.IntegrityConfig{
		IntegrityCheckLevel:   "none",
		CorruptionHandleLevel: "warn",
	},
	Consistent: &v2.ConsistentConfig{
		Level:                 "none",
		MaxLogSize:            64,
		FlushIntervalInMs:     2000,
		MetaFlushIntervalInMs: 200,
		Storage:               "abcdd",
		UseFileBackend:        false,
		EncodingWorkerNum:     31,
		FlushWorkerNum:        18,
		MemoryUsage: &v2.ConsistentMemoryUsage{
			MemoryQuotaPercentage: 80,
		},
	},
}

func TestReplicaConfigFieldNames(t *testing.T) {
	t.Parallel()
	data, err := json.Marshal(customReplicaConfig)
	require.Nil(t, err)
	regionDef := &ticdc_v1.ReplicaConfig{}
	require.Nil(t, protojson.Unmarshal(data, regionDef))
	_, err = protojson.Marshal(regionDef)
	require.Nil(t, err)
}
