package tiupcluster

import (
	"time"

	"github.com/pingcap/test-infra/caselib/pkg/model/workload"
	"github.com/pingcap/test-infra/caselib/pkg/steps"
	"github.com/pingcap/test-infra/caselib/pkg/utils"
	"github.com/pingcap/test-infra/caselib/ticdc/common"
)

// CDCTiupScal
// create testbed: tiup / mysql / workload
// deploy cluster with tiup cluster
// create changefeed
// create database named `workload`
// run workload prepare, then scale out cdc, scale in cdc
// run workload run
// wait for workload finish
// check consistency
func CDC_tiup_scale() steps.Step {
	var(
		tiupClusterVersion string
		mirrorAdress = "http://172.16.5.139:8988"
		workloadTiupClusterOption = workload.TiupClusterOption{"testdb", "tiup-peer", &tiupClusterVersion, "global:\n  user: \"tidb\"\nmonitored:\n  node_exporter_port: 9200\n  blackbox_exporter_port: 9215\npd_servers:\n  - host: tiup-peer\n    client_port: 2979\n    peer_port: 2980\n  - host: tiup-peer\n    client_port: 2079\n    peer_port: 2080\ntidb_servers:\n  - host: tiup-peer\n    status_port: 11080\n    port: 4000\ntikv_servers:\n  - host: tiup-peer\n    port: 21160\n    status_port: 21180\n\nmonitoring_servers:\n  - host: tiup-peer\ngrafana_servers:\n  - host: tiup-peer\ncdc_servers:\n  - host: tiup-peer\n", 0}
		dbNameVar    = common.DBName
	)
	return steps.
		NewBuilder().
		LoadEnv().
		LoadResourceFromEnv("TI_PARAM_RES_tiup", common.ResourceHandleTiUP).
		LoadResourceFromEnv("TI_PARAM_RES_workload", common.ResourceHandleWorkload).
		LoadResourceFromEnv("TI_PARAM_RES_downstream", common.ResourceHandleMySQL).
		LoadParamFromEnv(utils.ParamPrefix+"tiupClusterVersion", &tiupClusterVersion).
		InitTiup(common.ResourceHandleTiUP, common.ResourceHandleMySQL).
		RunTiupMirrorSet(workload.TiupMirrorOption{MirrorAdress: &mirrorAdress}).
		DeployTiupCluster(workloadTiupClusterOption).
		Sleep(20 * time.Second).
		TiupCreateChangefeed(workload.TiupChangefeedOption{Version: &tiupClusterVersion, PDAddr: "tiup-peer:2079", ChangefeedID: "tiup-task", Command: 0}).
		CreateDatabaseTiup(dbNameVar).
		InitWorkload(common.ResourceHandleWorkload).
		RunWorkloadTiup(common.Spec.GetWorkloadOption(workload.CommandTypePrepare)).
		ScaleOutTiCDCClusterTiup(workloadTiupClusterOption).
		RunWorkloadTiup(common.Spec.GetWorkloadOption(workload.CommandTypeRun)).
		SendFinishMarkTiup(dbNameVar).
		WaitFinishMark(common.ResourceHandleMySQL, dbNameVar, 3*time.Hour).
		CheckConsistencyTiup(workloadTiupClusterOption, dbNameVar).
		DepstroyTiupCluster(workloadTiupClusterOption).
		DropDatabasesIfExists(common.ResourceHandleMySQL, &dbNameVar).
		Build()
}
