package testcases

import (
	"time"

	"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"
	"github.com/pingcap/test-infra/caselib/pkg/utils"
	_ "github.com/pingcap/test-infra/sdk/resource/impl/k8s"
)

func init() {
	var (
		taskName       = "dm_upgrade_tolerance_source_down"
		sourceName0    = "source-0"
		sourceName1    = "source-1"
		sourceName2    = "source-2"
		sourceNameList = []string{sourceName0, sourceName1, sourceName2}
		name           = "dm_upgrade_tolerance_source_down"
		dbName         = "test"
		env            = newCommonEnv()
		targetVersion  = new(string)
	)

	loadOption1 := &workload.QihooOption{
		Command:        workload.CommandTypeLoad,
		PropertyFile:   "/workloads/workloadd",
		PropertyValues: []string{"recordcount=100000", "autocommit=1", "databasename=" + dbName, "tablecount=1"},
		Threads:        20,
		Duration:       3 * time.Minute,
	}

	loadOption2 := &workload.QihooOption{
		Command:        workload.CommandTypeLoad,
		PropertyFile:   "/workloads/workloadp",
		PropertyValues: []string{"recordcount=100000", "autocommit=1", "databasename=" + dbName, "tablecount=1"},
		Threads:        20,
		Duration:       3 * time.Minute,
	}

	loadOption3 := &workload.QihooOption{
		Command:        workload.CommandTypeLoad,
		PropertyFile:   "/workloads/workloada",
		PropertyValues: []string{"recordcount=100000", "autocommit=1", "databasename=" + dbName, "tablecount=1"},
		Threads:        20,
		Duration:       3 * time.Minute,
	}

	runOption1 := &workload.QihooOption{
		Command:        workload.CommandTypeRun,
		PropertyFile:   "/workloads/workloadd",
		PropertyValues: []string{"recordcount=100000", "autocommit=1", "databasename=" + dbName, "tablecount=1"},
		Threads:        20,
		Duration:       3 * time.Minute,
	}

	runOption2 := &workload.QihooOption{
		Command:        workload.CommandTypeRun,
		PropertyFile:   "/workloads/workloadp",
		PropertyValues: []string{"recordcount=100000", "autocommit=1", "databasename=" + dbName, "tablecount=1"},
		Threads:        20,
		Duration:       3 * time.Minute,
	}

	runOption3 := &workload.QihooOption{
		Command:        workload.CommandTypeRun,
		PropertyFile:   "/workloads/workloada",
		PropertyValues: []string{"recordcount=100000", "autocommit=1", "databasename=" + dbName, "tablecount=1"},
		Threads:        20,
		Duration:       3 * time.Minute,
	}

	var _ = AddTestCase(spec.CaseName(name), func() steps.Step {
		env.init().b.
			LoadParamFromEnv(utils.ParamPrefix+"targetVersion", targetVersion).
			DropDatabasesIfExists(env.UpStreams[0], &dbName).
			DropDatabasesIfExists(env.UpStreams[1], &dbName).
			DropDatabasesIfExists(env.UpStreams[2], &dbName).
			DropDatabasesIfExists(env.DownStream, &dbName).
			CreateDatabase(env.UpStreams[0], dbName).
			CreateDatabase(env.UpStreams[1], dbName).
			CreateDatabase(env.UpStreams[2], dbName).
			DmRunWorkload(env.UpStreams[0], env.Dm, env.Workload, loadOption1).
			DmRunWorkload(env.UpStreams[1], env.Dm, env.Workload, loadOption2).
			DmRunWorkload(env.UpStreams[2], env.Dm, env.Workload, loadOption3).
			DmCreateSources(env.Dm, env.DmHost, Path.SourcePaths).
			DmStartTask(env.Dm, env.DmHost, Path.TaskPaths[0]).
			DmWaitTaskSynced(env.DmHost, taskName, sourceNameList).
			DmCheckSyncDiff(env.Dm, env.SyncDiff, env.DmHost, Path.DiffPaths[0]).
			Parallel(
				steps.NewRunDMWorkload(env.UpStreams[1], env.Workload, runOption2),
				steps.NewRunDMWorkload(env.UpStreams[2], env.Workload, runOption3),
				steps.NewWorkloadFailureChaos(env.UpStreams[0], 1*time.Minute),
				steps.NewUpgradeDmCluster(env.DmHost, env.Dm, targetVersion, 0),
			).
			DmRunWorkload(env.UpStreams[0], env.Dm, env.Workload, runOption1).
			DmWaitTaskSynced(env.DmHost, taskName, sourceNameList).
			DmCheckSyncDiff(env.Dm, env.SyncDiff, env.DmHost, Path.DiffPaths[0])
		return env.b.Build()
	})
}
