package crrf

import (
	"fmt"

	"github.com/shiningrush/fastflow/pkg/entity"
	"github.com/shiningrush/fastflow/pkg/entity/run"
	"github.com/tidbcloud/dataflow-service/app/container"
	"github.com/tidbcloud/dataflow-service/app/workflow"
	crrf_common "github.com/tidbcloud/dataflow-service/app/workflow/action/crrf/common"
	crrf_disable "github.com/tidbcloud/dataflow-service/app/workflow/action/crrf/disable"
)

// GetDisableCRRFDag returns the DAG definition and actions for disabling CRRF.
//
// DAG sequence:
//  1. toggle_periodic_backup (enable=false) — disables CRRF periodic backup via mgmt service
//     2a. disable_crrf_daemon                  — calls DisableCRRF on cluster-server and waits until DISABLED
//     2b. modify_replication_rtc (enable=false) — disables S3 RTC synchronously (cloud API + transactional DB update)
//  3. mark_disabled                         — transitions CRRFSetting disabling → disabled, clears fields
func GetDisableCRRFDag() (*entity.Dag, []run.Action) {
	c := container.Global()

	actions := []run.Action{
		crrf_common.NewTogglePeriodicClusterSettingsBackupAction(c.DedicatedGlobalGrpcClient),
		crrf_disable.NewDisableCRRFDaemonAction(c.BackupSettingRepo, c.LogBackupRepo, c.CRRFSettingRepo, c.CRRFFacade),
		crrf_common.NewCRRFModifyReplicationRTCAction(c.BackupSettingModel, c.CRRFSettingRepo),
		crrf_disable.NewMarkDisabledAction(c.CRRFSettingRepo),
	}

	dag := &entity.Dag{
		BaseInfo: entity.BaseInfo{
			ID: workflow.DagDisableCRRF,
		},
		Name: workflow.DagDisableCRRF,
		Vars: entity.DagVars{
			workflow.KeyCRRFSettingID: {},
			workflow.ClusterID:        {},
		},
		Status: entity.DagStatusNormal,
		Tasks: []entity.Task{
			{
				ID:          workflow.ActionCRRFTogglePeriodicBackup + "_disable",
				ActionName:  workflow.ActionCRRFTogglePeriodicBackup,
				Params:      map[string]interface{}{workflow.ClusterID: fmt.Sprintf("{{%v}}", workflow.ClusterID), "enable": false},
				TimeoutSecs: 5 * 60,
			},
			{
				ID:          workflow.ActionCRRFDisableDaemon,
				ActionName:  workflow.ActionCRRFDisableDaemon,
				Params:      map[string]interface{}{workflow.ClusterID: fmt.Sprintf("{{%v}}", workflow.ClusterID)},
				DependOn:    []string{workflow.ActionCRRFTogglePeriodicBackup + "_disable"},
				TimeoutSecs: 15 * 60,
			},
			{
				ID:          workflow.ActionCRRFModifyReplicationRTC + "_disable",
				ActionName:  workflow.ActionCRRFModifyReplicationRTC,
				Params:      map[string]interface{}{workflow.ClusterID: fmt.Sprintf("{{%v}}", workflow.ClusterID), "enable": false},
				DependOn:    []string{workflow.ActionCRRFTogglePeriodicBackup + "_disable"},
				TimeoutSecs: 5 * 60,
			},
			{
				ID:          workflow.ActionCRRFMarkDisabled,
				ActionName:  workflow.ActionCRRFMarkDisabled,
				Params:      map[string]interface{}{workflow.ClusterID: fmt.Sprintf("{{%v}}", workflow.ClusterID)},
				DependOn:    []string{workflow.ActionCRRFDisableDaemon, workflow.ActionCRRFModifyReplicationRTC + "_disable"},
				TimeoutSecs: 5 * 60,
			},
		},
	}
	return dag, actions
}
