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"
)

// cdc_tiup_cluster_upgrade_sync
// create testbed: tiup / mysql / workload
// deploy cluster with tiup cluster
// create changefeed: tiup ctl:<version> cdc
// create database named `workload`
// run workload
// wait for workload finish
// check consistency
var _ = common.AddTestCase("cdc_tiup_cluster_upgrade_sync", func() steps.Step {
	var (
		originVersion				string
		workloadTiupClusterOption = workload.TiupClusterOption{"testdb", "tiup-peer", &originVersion, "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\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}
		tiupClusterVersion		    string
		mirrorAdress = "http://staging.tiup-server.pingcap.net"
	)

	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+"originVersion", &originVersion).
		LoadParamFromEnv(utils.ParamPrefix+"tiupClusterVersion", &tiupClusterVersion).
		InitTiup(common.ResourceHandleTiUP, common.ResourceHandleMySQL).
		RunTiupMirrorSet(workload.TiupMirrorOption{MirrorAdress: &mirrorAdress}).
		DeployTiupCluster(workloadTiupClusterOption).
		TiupCreateChangefeed(workload.TiupChangefeedOption{Version: &originVersion, PDAddr: "tiup-peer:2979", ChangefeedID: "tiup-task", Command: 0}).
		CreateDatabaseTiup(common.DBName).
		InitWorkload(common.ResourceHandleWorkload).
		RunWorkloadTiup(common.Spec.GetWorkloadOption(workload.CommandTypePrepare)).
		UpgradeTiupCluster(&tiupClusterVersion).
		RunWorkloadTiup(common.Spec.GetWorkloadOption(workload.CommandTypeRun)).
		SendFinishMarkTiup(common.DBName).
		WaitFinishMark(common.ResourceHandleMySQL, common.DBName, 3*time.Hour).
		CheckConsistencyTiup(workloadTiupClusterOption, common.DBName).
		Sleep(1 * time.Minute).
		Build()
},
)
