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

// CDCTiupLongStable
// create testbed: tiup / mysql / workload
// deploy cluster with tiup cluster
// create changefeed
// create database named `workload`
// run workload, then restart cdc node per 30min
// wait for workload finish
// check consistency
var _ = common.AddTestCase("cdc_tiup_long_stable", func() steps.Step {
	var (
		tiupClusterVersion string
		mirrorAdress = "http://172.16.5.139:8988"
		dbNameVar    = common.DBName
		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}
	)
	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(common.DBName).
		InitWorkload(common.ResourceHandleWorkload).
		RunWorkloadTiup(common.Spec.GetWorkloadOption(workload.CommandTypePrepare)).
		ScaleOutTiCDCClusterTiup(workloadTiupClusterOption).
		Parallel(
			steps.NewRunWorkloadTiup(common.Spec.GetWorkloadOption(workload.CommandTypeRun)),
			steps.NewPeriodicalTask(24*time.Hour, 1*time.Hour, steps.NewRestartTiCDCTiup(workloadTiupClusterOption)),
		).
		SendFinishMarkTiup(common.DBName).
		WaitFinishMark(common.ResourceHandleMySQL, dbNameVar, 3*time.Hour).
		CheckConsistencyTiup(workloadTiupClusterOption, dbNameVar).
		Build()
},
)