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 DumpFromMySQL() steps.Step {
	var (
		mysqlRes      = &resource.ResourceHandle{}
		loaderRes     = &resource.ResourceHandle{}
		dumplingRes   = &resource.ResourceHandle{}
		loaderOpts    = &host.LoaderOpts{}
		mcCopyOpts    = &host.McCopyOpts{}
		dumplingOpts  = &host.DumplingGeneralOpts{}
		dropDatabases string
	)

	return steps.
		NewBuilder().
		LoadEnv().
		LoadResourceFromEnv(utils.ResourcePrefix+"mysql", mysqlRes).
		LoadResourceFromEnv(utils.ResourcePrefix+"loader", loaderRes).
		LoadResourceFromEnv(utils.ResourcePrefix+"dumpling", dumplingRes).
		LoadResourceFromEnv(utils.ParamPrefix+"loader_opts", loaderOpts).
		LoadResourceFromEnv(utils.ParamPrefix+"mc_copy_opts", mcCopyOpts).
		LoadResourceFromEnv(utils.ParamPrefix+"dumpling_opts", dumplingOpts).
		LoadParamFromEnv(utils.ParamPrefix+"drop_databases", &dropDatabases).
		DropDatabasesIfExists(mysqlRes, &dropDatabases).
		McCopy(mcCopyOpts, loaderRes).
		ExecuteSQL(mysqlRes, "", "create database if not exists tidb_loader").
		LoaderToMySQL(loaderRes, mysqlRes, loaderOpts).
		ExecuteSQL(mysqlRes, "", "drop database if exists tidb_loader").
		Dumpling(dumplingRes, mysqlRes, dumplingOpts).
		Build()
}

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