package dmcluster

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/cluster-service-ng/domain/entity"
	mysql2 "github.com/tidbcloud/cluster-service-ng/pkg/storage/mysql"
	"github.com/tidbcloud/cluster-service-ng/pkg/storage/mysql/schema"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

func newTestDMClusterRepo(t *testing.T) (*dmClusterRepoImpl, *gorm.DB) {
	t.Helper()

	gdb, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
	require.NoError(t, err)
	require.NoError(t, gdb.Exec(`
		CREATE TABLE dm_clusters (
			id varchar(128) PRIMARY KEY,
			shared_pool_id varchar(128),
			dataplane_name text NOT NULL,
			backend varchar(32) NOT NULL DEFAULT 'legacy',
			template_version integer,
			created_at datetime,
			updated_at datetime,
			deleted_at datetime
		)
	`).Error)

	provider, _, _ := mysql2.NewDBProvider(gdb)
	return &dmClusterRepoImpl{provider: provider}, gdb
}

func TestDMClusterRepoSaveSetsOperatorV2ForNewCluster(t *testing.T) {
	ctx := context.Background()
	repo, gdb := newTestDMClusterRepo(t)

	err := repo.Save(ctx, &entity.DMCluster{
		Id:            "dm-new",
		SharedPoolId:  "sp-1",
		DataplaneName: "dp-1",
		Backend:       entity.DMBackendLegacyProto,
	})
	require.NoError(t, err)

	var model schema.DmCluster
	require.NoError(t, gdb.Where("id = ?", "dm-new").First(&model).Error)
	require.Equal(t, entity.DMBackendOperatorV2, model.Backend)
}

func TestDMClusterRepoGetBackendAlwaysReturnsOperatorV2(t *testing.T) {
	ctx := context.Background()
	repo, gdb := newTestDMClusterRepo(t)

	require.NoError(t, gdb.Create(&schema.DmCluster{
		ID:            "dm-legacy",
		SharedPoolID:  "sp-1",
		DataplaneName: "dp-1",
		Backend:       entity.DMBackendLegacy,
	}).Error)
	require.NoError(t, gdb.Create(&schema.DmCluster{
		ID:            "dm-invalid",
		SharedPoolID:  "sp-1",
		DataplaneName: "dp-1",
		Backend:       "unexpected",
	}).Error)

	backend, err := repo.GetBackend(ctx, "dm-legacy", false)
	require.NoError(t, err)
	require.Equal(t, entity.DMBackendOperatorV2, backend)

	backend, err = repo.GetBackend(ctx, "dm-invalid", false)
	require.NoError(t, err)
	require.Equal(t, entity.DMBackendOperatorV2, backend)
}
