//go:build integration

package resourcepool

import (
	"context"
	"os"
	"testing"

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

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

var integrationDBProvider pkgv2db.TransProvider

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

	mysqlContainer, host, port, err := testdata.StartMysqlContainer(
		ctx,
		cfg.MysqlConfig.Database,
		cfg.MysqlConfig.User,
		cfg.MysqlConfig.Password,
	)
	if err != nil {
		panic(err)
	}
	cfg.MysqlConfig.Host = host
	cfg.MysqlConfig.Port = port

	_, provider, _ := repoimpldb.NewDBProvider(repoimpldb.NewDB(cfg))
	if err := migration.RunDBMigrate(provider.WriteDB(ctx)); err != nil {
		panic(err)
	}
	integrationDBProvider = provider
	if err := initializeResourcePoolRepositoryTestData(ctx, provider); err != nil {
		panic(err)
	}

	exitCode := m.Run()
	if err := mysqlContainer.Terminate(ctx); err != nil {
		panic(err)
	}
	os.Exit(exitCode)
}

func initializeResourcePoolRepositoryTestData(ctx context.Context, provider pkgv2db.Provider) error {
	providerRecord := testdata.GetProviderRecords()[0]
	if err := provider.WriteDB(ctx).Create(providerRecord).Error; err != nil {
		return err
	}
	regionRecords := testdata.GetRegionRecords()
	return provider.WriteDB(ctx).Create([]*schema.Region{
		regionRecords[0], // AWS us-west-2, logical region a0
		regionRecords[1], // AWS us-west-2, logical region a1
		regionRecords[3], // AWS us-east-1
	}).Error
}
