package openapiserverless

import (
	"testing"
	"time"

	"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"
	"github.com/tidbcloud/tidb-management-service/utilities/randstr"
)

func TestClusterConnectPublicEndpoint(t *testing.T) {
	testSuite := &TestClusterConnectPublicEndpointSuite{
		host:              viper.GetString("host"),
		apiKey:            viper.GetString("api_key"),
		prjID:             viper.GetString("prj_id"),
		clusterNamePrefix: viper.GetString("cluster_name_prefix"),

		region:     "regions/aws-us-east-1",
		password:   randstr.GenWithCharset(16, randstr.AlphabetCharset),
		spendLimit: 1000, // 10 USD
	}

	testSuite.clusterName = testSuite.clusterNamePrefix + randstr.GenWithCharset(4, randstr.AlphabetCharset)
	suite.Run(t, testSuite)
}

type TestClusterConnectPublicEndpointSuite struct {
	suite.Suite

	host   string
	apiKey string

	prjID             string
	clusterNamePrefix string

	region      string
	password    string
	clusterName string
	spendLimit  int32

	serverlessCli *serverlessapi.Cli

	clusterID string
}

func (su *TestClusterConnectPublicEndpointSuite) TearDownSuite() {
	if su.clusterID != "" {
		su.serverlessCli.EnsureDeleteCluster(su.prjID, su.clusterName)
	}
}

func (su *TestClusterConnectPublicEndpointSuite) 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 *TestClusterConnectPublicEndpointSuite) Test_02_CreateCluster() {
	su.clusterID = su.serverlessCli.CreateCluster(
		&model.TidbCloudOpenApiserverlessv1beta1Cluster{
			DisplayName: &su.clusterName,
			Region: &model.Commonv1beta1Region{
				Name: &su.region,
			},
			SpendingLimit: &model.ClusterSpendingLimit{
				Monthly: su.spendLimit,
			},
			Labels: map[string]string{
				"tidb.cloud/project": su.prjID,
			},
		},
	)
	su.Require().NotEmpty(su.clusterID)
}

func (su *TestClusterConnectPublicEndpointSuite) Test_03_PollClusterStatus() {
	// timeout: 30 minutes (1800 seconds)
	for range 180 {
		state := su.serverlessCli.PollClusterStatus(su.clusterID)
		if *state == model.Commonv1beta1ClusterStateACTIVE {
			break
		}
		su.T().Logf("cluster status: %s", *state)
		time.Sleep(10 * time.Second)
	}
}

// TODO: use sql user OPen API to Create sql user
// func (su *TestClusterConnectPublicEndpointSuite) Test_04_CeateSQLUser() {
// }
