package auditlogv2

import (
	"context"
	"fmt"
	"strings"
	"testing"

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

	"github.com/tidbcloud/tidb-management-service/functional-test/pkg/config"
	dedicatedapi "github.com/tidbcloud/tidb-management-service/functional-test/pkg/dedicatedapi/api"
	"github.com/tidbcloud/tidb-management-service/functional-test/pkg/dedicatedapi/api/client"
)

const (
	envPrefix = "OPEN_API_DEDICATED"
	pageSize  = 100
)

func TestMain(m *testing.M) {
	config.SetUpTestConfig(envPrefix)

	defer cleanUpAllClustersWithTestNamePrefix()

	m.Run()
}

func cleanUpAllClustersWithTestNamePrefix() {
	clusterNamePrefix := viper.GetString("cluster_name_prefix")
	prjId := viper.GetString("prj_id")
	host := viper.GetString("host")
	apiKey := viper.GetString("api_key")

	cli := dedicatedapi.NewClient(&suite.Suite{}, host, apiKey)
	cli.GetConfig().Debug = false

	ctx := context.Background()

	req := cli.ClusterServiceAPI.ClusterServiceListClusters(ctx).
		ProjectId(prjId).
		PageSize(100)

	resp, _, err := req.Execute()
	if err != nil {
		panic(err)
	}

	toDelete := lo.Filter(resp.GetClusters(), func(item client.TidbCloudOpenApidedicatedv1beta1Cluster, _ int) bool {
		return strings.HasPrefix(item.GetDisplayName(), clusterNamePrefix)
	})

	for i := range toDelete {
		_, _, err := cli.ClusterServiceAPI.ClusterServiceDeleteCluster(ctx, toDelete[i].GetClusterId()).Execute()
		fmt.Println("Deleted cluster", toDelete[i].GetDisplayName(), "with error", err)
	}
}
