package main

import (
	"context"

	"github.com/pingcap/test-infra/caselib/pkg/host"
	"github.com/pingcap/test-infra/caselib/pkg/steps"
	"github.com/pingcap/test-infra/caselib/pkg/utils"
	"github.com/pingcap/test-infra/common/model/resource"
	_ "github.com/pingcap/test-infra/sdk/resource/impl/k8s"
	"go.uber.org/zap"
)

func BrRestoreFullOnly() steps.Step {
	var (
		dstTidb            = &resource.ResourceHandle{}
		brHost             = &resource.ResourceHandle{}
		backupOpts         = &host.BackupFullOpts{}
		globalVariableOpts = &steps.TiDBVariableList
		queryVerify        = &steps.QueryExecptedResultList
	)

	return steps.
		NewBuilder().
		LoadEnv().
		LoadResourceFromEnv(utils.ResourcePrefix+"dst_tidb", dstTidb).
		LoadResourceFromEnv(utils.ResourcePrefix+"br", brHost).
		LoadResourceFromEnv(utils.ParamPrefix+"br_opts", backupOpts).
		LoadResourceFromEnv(utils.ParamPrefix+"global_variable", &globalVariableOpts).
		LoadResourceFromEnv(utils.ParamPrefix+"query_verify", &queryVerify).
		DropUserDatabases(dstTidb).
		ConfigGlobalVariable(globalVariableOpts, dstTidb).
		BrRestoreFull(brHost, dstTidb, backupOpts).
		VerifyQueryResult(queryVerify, dstTidb).
		CheckUserDatabasesCrc32(&backupOpts.Crc32Checksum, dstTidb).
		Build()
}

func main() {
	_, logger := utils.GetCtxAndLogger()
	ctx := steps.New(context.Background())
	if err := BrRestoreFullOnly().Execute(ctx); err != nil {
		logger.Fatal("BrRestoreFullOnly failed", zap.Error(err))
	}
	logger.Info("BrRestoreFullOnly passed")
}
