package export

import (
	"encoding/json"
	"testing"

	"github.com/stretchr/testify/require"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
)

func TestExportProtoSchemaConversionsPreserveOptionalFields(t *testing.T) {
	dialect := globalngv1.ExportOptions_ExportCSVDialect_SNOWFLAKE
	escapeBackslash := false
	const snapshotTSO = uint64(448266862624768042)

	schemaExport := protoToSchema(&globalngv1.Export{
		SnapshotTso: snapshotTSO,
		ExportOptions: &globalngv1.ExportOptions{
			Filter: &globalngv1.ExportOptions_Filter{
				Type: &globalngv1.ExportOptions_Filter_Table_{
					Table: &globalngv1.ExportOptions_Filter_Table{Partitions: []string{"p0", "p1"}},
				},
			},
			CsvFormat:       &globalngv1.ExportOptions_CSVFormat{Dialect: &dialect},
			EscapeBackslash: &escapeBackslash,
			ParquetFormat: &globalngv1.ExportOptions_ParquetFormat{
				Compression: globalngv1.ExportParquetCompressionType_ZSTD,
			},
		},
	})

	require.Equal(t, snapshotTSO, schemaExport.SnapshotTso)
	require.NotNil(t, schemaExport.ExportOptions.CSVFormat.Dialect)
	require.Equal(t, dialect.String(), *schemaExport.ExportOptions.CSVFormat.Dialect)
	require.Equal(t, []string{"p0", "p1"}, schemaExport.ExportOptions.Filter.Table.Partitions)
	require.NotNil(t, schemaExport.ExportOptions.EscapeBackslash)
	require.False(t, *schemaExport.ExportOptions.EscapeBackslash)
	require.Equal(t, globalngv1.ExportParquetCompressionType_ZSTD.String(), schemaExport.ExportOptions.ParquetFormat.Compression)

	got := schemaExportOptionsToProto(schemaExport.ExportOptions)
	require.Equal(t, dialect, got.GetCsvFormat().GetDialect())
	require.Equal(t, []string{"p0", "p1"}, got.GetFilter().GetTable().GetPartitions())
	require.NotNil(t, got.EscapeBackslash)
	require.False(t, got.GetEscapeBackslash())
	require.Equal(t, globalngv1.ExportParquetCompressionType_ZSTD, got.GetParquetFormat().GetCompression())
}

func TestExportProtoSchemaConversionsPreserveEmptyParquetFormat(t *testing.T) {
	schemaOptions := protoExportOptionsToSchema(&globalngv1.ExportOptions{
		ParquetFormat: &globalngv1.ExportOptions_ParquetFormat{},
	})

	require.NotNil(t, schemaOptions.ParquetFormat)
	require.Empty(t, schemaOptions.ParquetFormat.Compression)
	storedJSON, err := json.Marshal(schemaOptions.ParquetFormat)
	require.NoError(t, err)
	require.JSONEq(t, `{}`, string(storedJSON))

	got := schemaExportOptionsToProto(schemaOptions)
	require.NotNil(t, got.ParquetFormat)
	require.Equal(
		t,
		globalngv1.ExportParquetCompressionType_PARQUET_COMPRESSION_TYPE_UNSPECIFIED,
		got.ParquetFormat.GetCompression(),
	)
}
