package vo

import (
	"context"
	"testing"
	"time"

	"github.com/stretchr/testify/require"
	"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 TestPreparingExportMapsToPublicRunning(t *testing.T) {
	require.Equal(t, v1beta1.ExportState_RUNNING, convertToV1beta1State(constant.ExportStatePreparing, nil))
	require.Equal(t, console.ExportState_RUNNING, convertToConsoleState(constant.ExportStatePreparing, nil))
}

func TestExportColumnSelectorsRoundTripToAPIs(t *testing.T) {
	now := time.Now()
	export := &Export{
		ID:        "exp-1",
		ClusterID: "cluster-1",
		CreatedAt: &now,
		ColumnSelectors: []entity.ColumnSelector{{
			Matcher: []string{"app.orders"},
			Columns: []string{"*", "!customer_email"},
		}},
	}

	public := export.ConvertToV1beta1(context.Background())
	require.Len(t, public.ExportOptions.ColumnSelectors, 1)
	require.Equal(t, []string{"app.orders"}, public.ExportOptions.ColumnSelectors[0].Matcher)
	require.Equal(t, []string{"*", "!customer_email"}, public.ExportOptions.ColumnSelectors[0].Columns)

	consoleExport := export.ConvertToConsole(context.Background())
	require.Len(t, consoleExport.ExportOptions.ColumnSelectors, 1)
	require.Equal(t, []string{"app.orders"}, consoleExport.ExportOptions.ColumnSelectors[0].Matcher)
	require.Equal(t, []string{"*", "!customer_email"}, consoleExport.ExportOptions.ColumnSelectors[0].Columns)
}

func TestExportColumnSelectorsValidation(t *testing.T) {
	valid := &Export{
		ColumnSelectors: []entity.ColumnSelector{
			{Matcher: []string{"app.orders"}, Columns: []string{"*", "!customer_email"}},
		},
	}
	require.NoError(t, valid.CheckOptions(context.Background()))

	require.Error(
		t,
		(&Export{ColumnSelectors: []entity.ColumnSelector{{Columns: []string{"*"}}}}).CheckOptions(
			context.Background(),
		),
	)
	require.Error(
		t,
		(&Export{ColumnSelectors: []entity.ColumnSelector{{Matcher: []string{"app.orders"}}}}).CheckOptions(
			context.Background(),
		),
	)
	require.Error(
		t,
		(&Export{ColumnSelectors: []entity.ColumnSelector{{Matcher: []string{"not a valid table filter"}, Columns: []string{"*"}}}}).CheckOptions(
			context.Background(),
		),
	)
	require.Error(
		t,
		(&Export{ColumnSelectors: []entity.ColumnSelector{{Matcher: []string{"app.orders"}, Columns: []string{"["}}}}).CheckOptions(
			context.Background(),
		),
	)
	require.Error(
		t,
		(&Export{SQL: "SELECT * FROM app.orders", ColumnSelectors: valid.ColumnSelectors}).CheckOptions(
			context.Background(),
		),
	)
}
