package testcases

import (
	"github.com/pingcap/test-infra/caselib/pkg/model/workload"
	"github.com/pingcap/test-infra/caselib/pkg/spec"
	"github.com/pingcap/test-infra/caselib/pkg/steps"
)

func init() {
	var (
		worker0        = "dm-dm-worker-0"
		worker1        = "dm-dm-worker-1"
		worker2        = "dm-dm-worker-2"
		boundWorker0   = new(string)
		boundWorker1   = new(string)
		boundWorker2   = new(string)
		taskName       = "test-infra"
		sourceName0    = "source-0"
		sourceNameList = []string{sourceName0}
		name           = "dm_transfer_source_continuous_transfer"
		env            = newCommonEnv()
	)

	var _ = AddTestCase(spec.CaseName(name), func() steps.Step {
		env.init().b.
			DropDatabasesIfExists(env.UpStreams[0], &name).
			DropDatabasesIfExists(env.DownStream, &name).
			CreateDatabase(env.UpStreams[0], name).
			DmCreateSources(env.Dm, env.DmHost, Path.SourcePaths).
			DmRunWorkload(env.UpStreams[0], env.Dm, env.Workload, Spec.GetWorkloadOption(workload.CommandTypePrepare)).
			DmStartTask(env.Dm, env.DmHost, Path.TaskPaths[0]).
			DmWaitTaskSynced(env.DmHost, taskName, sourceNameList).
			DmCheckSyncDiff(env.Dm, env.SyncDiff, env.DmHost, Path.DiffPaths[0]).
			DmPauseTask(env.Dm, env.DmHost, Path.TaskPaths[0]).
			DmTransferSourceToWorker(env.DmHost, sourceName0, worker0).
			DmGetSourceWorker(env.DmHost, sourceName0, boundWorker0).
			AssertString(boundWorker0, &worker0, true).
			DmTransferSourceToWorker(env.DmHost, sourceName0, worker1).
			DmGetSourceWorker(env.DmHost, sourceName0, boundWorker1).
			AssertString(boundWorker1, &worker1, true).
			DmTransferSourceToWorker(env.DmHost, sourceName0, worker2).
			DmGetSourceWorker(env.DmHost, sourceName0, boundWorker2).
			AssertString(boundWorker2, &worker2, true).
			DmResumeTask(env.Dm, env.DmHost, Path.TaskPaths[0]).
			DmRunWorkload(env.UpStreams[0], env.Dm, env.Workload, Spec.GetWorkloadOption(workload.CommandTypeRun)).
			DmWaitTaskSynced(env.DmHost, taskName, sourceNameList).
			DmCheckSyncDiff(env.Dm, env.SyncDiff, env.DmHost, Path.DiffPaths[0])
		return env.b.Build()
	})
}
