package cluster

import (
	"context"
	"sync/atomic"
	"testing"

	pkgv2db "github.com/tidbcloud/pkgv2/db"
	"github.com/tidbcloud/pkgv2/gormutil"

	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/infra/repoimpl/db"
	migrate "github.com/tidbcloud/tidb-management-service/nextgen-global-service/infra/repoimpl/migration"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/pkg/config"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/pkg/testdata"
)

var dbProvider atomic.Pointer[pkgv2db.TransProvider]

func TestMain(m *testing.M) {
	var (
		ctx = context.Background()
		c   = &config.Config{
			MysqlConfig: gormutil.Config{
				User:     "root",
				Database: "local_test",
				Password: "password",
				LogLevel: "warn",
			},
		}
	)

	mysqlContainer, host, port, err := testdata.StartMysqlContainer(
		ctx,
		c.MysqlConfig.Database,
		c.MysqlConfig.User,
		c.MysqlConfig.Password,
	)
	if err != nil {
		panic(err)
	}
	defer func() {
		if err := mysqlContainer.Terminate(ctx); err != nil {
			panic(err)
		}
	}()

	c.MysqlConfig.Host = host
	c.MysqlConfig.Port = port

	_, pvd, _ := db.NewDBProvider(db.NewDB(c))
	if err := migrate.RunDBMigrate(pvd.WriteDB(ctx)); err != nil {
		panic(err)
	}

	// Seed providers and regions (required for cluster foreign keys).
	providers := testdata.GetProviderRecords()
	for i := range providers {
		if err := pvd.WriteDB(ctx).Create(providers[i]).Error; err != nil {
			panic(err)
		}
	}
	regions := testdata.GetRegionRecords()
	for i := range regions {
		regions[i].Status = "active"
		if err := pvd.WriteDB(ctx).Create(regions[i]).Error; err != nil {
			panic(err)
		}
	}

	dbProvider.Store(&pvd)

	m.Run()
}
