package MainOrder

import (
	"fmt"
	"testing"

	"github.com/tidbcloud/qa-PlatformAPIAuto/common"
	"github.com/tidbcloud/qa-PlatformAPIAuto/openAPIScene"
	"github.com/tidbcloud/qa-gourd/ProductService"

	l4g "github.com/alecthomas/log4go"
	"github.com/tidbcloud/qa-PlatformAPIAuto/webScene"
)

func TestDedicated(t *testing.T) {
	t.Parallel()
	if len(DedicatedList) == 0 {
		return
	}

	requestInfo := DeepCopy(RequestInfo) //Solve the problem of context confusion during concurrency
	requestInfo.SetReporter(t)
	ProductService.SendStartBillsMeteringSignal("Dedicated")
	if requestInfo.GetClusterInfo().ClusterId == "" {
		if !t.Run(fmt.Sprintf("CreateDedicatedCluster_%s", requestInfo.GetClusterInfo().Provider), requestInfo.DedicatedCreateCluster) {
			return
		}
	}

	//old arch param ini
	InitializationParameterConversion(requestInfo)

	var auditRunFlag bool
	for _, casedata := range DedicatedList {
		if casedata == "DedicatedAuditLog" {
			//会清理集群所以需要最后跑
			auditRunFlag = true
			continue
		}
		l4g.Info("+++++++++++%s", casedata)
		t.Run(casedata, func(t *testing.T) {
			requestInfo.CallFunctionByName(casedata, t)
		})
	}
	if auditRunFlag {
		t.Run("DedicatedAuditLog", func(t *testing.T) {
			requestInfo.CallFunctionByName("DedicatedAuditLog", t)
		})
	}

	//集群清理，billing校验
	if requestInfo.GetClusterInfo().ClusterId != "" && !requestInfo.GetClusterInfo().RemainFlag {
		requestInfo.DeleteCluster()
		if v, ok := requestInfo.(*webScene.WebE2ECase); ok {
			if !auditRunFlag {
				common.SendClusterDeletedCost(v.WebRequestInfo)
			}
		}
	}
	ProductService.SendStopBillsMeteringSignal("Dedicated")

	//if infraRunFlag {
	//	allure.Test(t,
	//		allure.Epic("ClearInfraProviderEnv"),
	//		allure.Feature("ClearInfraProviderEnv"),
	//		allure.Description("ClearInfraProviderEnv"),
	//		allure.Action(func() {
	//			common.DeleteClusterLabel(t, requestInfo.GetClusterInfo().ClusterId)
	//			common.DeleteNetworkLabel(t)
	//			common.DeleteEKSInfraProvider(t, common.GetDeploymentName())
	//			common.DeleteEKSConfigMap(t, common.GetConfigMapName())
	//		}))
	//}

	if v, ok := requestInfo.(*openAPIScene.OpenAPIE2ECase); ok {
		v.OpenAPIRequestInfo.DeleteAPIKey()
	}
	l4g.Info("DedicatedMainOrder done")
}
