package openapiserverless

import (
	"testing"

	"github.com/samber/lo"
	"github.com/spf13/viper"
	"github.com/stretchr/testify/suite"

	serverlessapi "github.com/tidbcloud/tidb-management-service/functional-test/pkg/serverlessapi/api"
	"github.com/tidbcloud/tidb-management-service/functional-test/pkg/serverlessapi/api/model"
)

//	TestClusterRegion verifies end-to-end cluster creation and cleanup
//
// by initializing a client, creating a cluster, checking its status, and deleting the cluster.
func TestClusterRegion(t *testing.T) {
	testSuite := &TestClusterRegionSuite{
		host:   viper.GetString("host"),
		apiKey: viper.GetString("api_key"),

		region:            "regions/aws-us-east-1",
		regionDisplayName: "N. Virginia (us-east-1)",
	}

	suite.Run(t, testSuite)
}

type TestClusterRegionSuite struct {
	suite.Suite

	host   string
	apiKey string

	region            string
	regionDisplayName string

	serverlessCli *serverlessapi.Cli
}

func (su *TestClusterRegionSuite) TearDownSuite() {
}

func (su *TestClusterRegionSuite) Test_01_InitializeClient() {
	var err error
	su.serverlessCli, err = serverlessapi.NewClient(&su.Suite, su.host, su.apiKey)
	su.Require().NoError(err)
	su.Require().NotNil(su.serverlessCli)
}

func (su *TestClusterRegionSuite) Test_02_ListProvidersAndSelectAwsUsEast1() {
	providers := su.serverlessCli.ListProviders()

	r, ok := lo.Find(providers, func(r *model.Commonv1beta1Region) bool {
		return r != nil && r.Name != nil && *r.Name == su.region
	})
	su.Require().True(ok)
	su.Require().Equal(su.regionDisplayName, r.DisplayName)
	su.Require().NotNil(r.Provider)
}
