// Copyright 2021 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// See the License for the specific language governing permissions and
// limitations under the License.

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_then_start_relay"
		sourceName0    = "source-0"
		sourceName1    = "source-1"
		boundWorker0   = new(string)
		relaycon0      = new(string)
		boundWorker1   = new(string)
		relaycon1      = new(string)
		sourceNameList = []string{sourceName0, sourceName1}
		name           = "dm_upgrade_then_start_relay"
		env            = newCommonEnv()
		targetversion  string
		dbName         = "test"
	)

	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,
	}

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

	runOption21 := &workload.QihooOption{
		Command:        workload.CommandTypeRun,
		PropertyFile:   "/workloads/workloadp",
		PropertyValues: []string{"recordcount=500000", "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).
			CreateDatabase(env.UpStreams[0], dbName).
			CreateDatabase(env.UpStreams[1], dbName).
			DmRunWorkload(env.UpStreams[0], env.Dm, env.Workload, loadOption1).
			DmRunWorkload(env.UpStreams[1], env.Dm, env.Workload, loadOption2).
			DmCreateSources(env.Dm, env.DmHost, Path.SourcePaths).
			DmStartTasks(env.Dm, env.DmHost, Path.TaskPaths).
			Parallel(
				steps.NewRunDMWorkload(env.UpStreams[0], env.Workload, runOption11),
				steps.NewRunDMWorkload(env.UpStreams[1], env.Workload, runOption21),
			).
			DmUpgradeDmCluster(env.DmHost, env.Dm, &targetversion, 30*time.Minute).
			DmGetSourceWorker(env.DmHost, sourceName0, boundWorker0).
			JointString(sourceName0, boundWorker0, relaycon0).
			DmStartRelay(env.Dm, env.DmHost, relaycon0).
			DmGetSourceWorker(env.DmHost, sourceName1, boundWorker1).
			JointString(sourceName1, boundWorker1, relaycon1).
			DmStartRelay(env.Dm, env.DmHost, relaycon1).
			DmWaitTaskSynced(env.DmHost, taskName, sourceNameList).
			DmCheckSyncDiff(env.Dm, env.SyncDiff, env.DmHost, Path.DiffPaths[0])
		return env.toBuilder().Build()
	})
}
