package e2e

import (
	"fmt"
	"os"
	"testing"

	"github.com/stretchr/testify/suite"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/consts"
	"github.com/tidbcloud/infra-provider/regional-server/test/e2e/driver"
)

var dataPlaneDriver *driver.DataPlaneDriver

func TestMain(m *testing.M) {
	var exitCode int

	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Recovered from panic:", r)
			exitCode = 1
		}
		os.Exit(exitCode)
	}()

	dataPlaneDriver = &driver.DataPlaneDriver{}
	defer func() {
		if dataPlaneDriver.GetDataPlaneID() != "" {
			if err := dataPlaneDriver.TearDown(); err != nil {
				fmt.Println("TearDown err:", err)
				exitCode = 1
			}
		}
	}()

	if err := dataPlaneDriver.Setup(); err != nil {
		fmt.Println("Setup err:", err)
		exitCode = 1
		return
	}
	if !IsAllUpboundCRReady(dataPlaneDriver.GetConfig().CloudProvider,
		dataPlaneDriver.GetClient().ControlPlaneK8sProxyService,
		getLabelSelector(consts.DataplaneLabelKey, dataPlaneDriver.GetDataPlaneID())) {
		fmt.Println("not all upbound cr is ready")
		exitCode = 1
		return
	}

	exitCode = m.Run()
}

func TestBucket(t *testing.T) {
	t.Parallel()
	suite.Run(t, newBucketTestSuite(
		dataPlaneDriver.GetDataPlaneID(), dataPlaneDriver.GetClient(), dataPlaneDriver.GetConfig()))
}

func TestLoadBalancerPrivateLink(t *testing.T) {
	t.Parallel()
	suite.Run(t, newLoadBalancerPrivateLinkTestSuite(dataPlaneDriver.GetDataPlaneID(), dataPlaneDriver.GetClient()))
}

func TestNodePools(t *testing.T) {
	t.Parallel()
	suite.Run(t, newNodePoolTestSuite(dataPlaneDriver.GetDataPlaneID(), dataPlaneDriver.GetClient()))
}

func TestNodePoolConfigs(t *testing.T) {
	t.Parallel()
	suite.Run(t, newNodePoolConfigTestSuite(dataPlaneDriver.GetClient()))
}
