package main

import (
	"context"

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

// This case need to 3 pd, 3 tidb, 4 tikv
// Scale-in before import data
// Scale-out to 3 pd, 3 tidb, 3 tikv
func ImportBasicClusterScale() steps.Step {
	var (
		tidbRes       = &apiresouce.ResourceHandle{}
		lightningRes  = &apiresouce.ResourceHandle{}
		opts          = &steps.LightningImportOpts{}
		dropDatabases string
	)
	return steps.
		NewBuilder().
		LoadEnv().
		LoadParamFromEnv(utils.ParamPrefix+"drop_databases", &dropDatabases).
		LoadResourceFromEnv(utils.ParamPrefix+"import_basic_opts", opts).
		LoadResourceFromEnv(utils.ResourcePrefix+"target", tidbRes).
		LoadResourceFromEnv(utils.ResourcePrefix+"lightning", lightningRes).
		DropDatabasesIfExists(tidbRes, &dropDatabases).
		// scale-in tidb
		ScaleTiDBcomponent(tidbRes, resource.TiDB, 2, 0).
		// scale-in tikv
		ScaleTiDBcomponent(tidbRes, resource.TiKV, 3, 0).
		// scale-in pd
		ScaleTiDBcomponent(tidbRes, resource.PD, 2, 0).
		LightningImport(opts, lightningRes, tidbRes).
		CheckDatabasesCrc32(&opts.Crc32Checksum, &dropDatabases, tidbRes).
		// drop database for next testing
		DropDatabasesIfExists(tidbRes, &dropDatabases).
		// scale-out tidb
		ScaleTiDBcomponent(tidbRes, resource.TiDB, 3, 0).
		// scale-out tikv
		ScaleTiDBcomponent(tidbRes, resource.TiKV, 4, 0).
		// scale-out pd
		ScaleTiDBcomponent(tidbRes, resource.PD, 3, 0).
		LightningImport(opts, lightningRes, tidbRes).
		CheckDatabasesCrc32(&opts.Crc32Checksum, &dropDatabases, tidbRes).
		Build()
}

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