//nolint:gomnd,funlen
package backup_setting

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"
	"github.com/tidbcloud/dataflow-service/app/workflow/action/backup_setting/create"
)

func GetCreateBackupSettingDag() (*entity.Dag, []run.Action) {
	actions := []run.Action{
		create.NewCreateAndCheckBucketReadyAction(
			container.Global().TransProvider,
			container.Global().BucketRepo,
			container.Global().BackupSettingRepo,
			container.Global().BucketModelProxy,
		),
		create.NewAddNodeRoleToBucketPolicyAction(
			container.Global().TransProvider,
			container.Global().BucketRepo,
			container.Global().BackupSettingRepo,
			container.Global().BucketModelProxy,
		),
		create.NewCreateBackupSettingFinalAction(
			container.Global().TransProvider,
			container.Global().BucketRepo,
			container.Global().BackupSettingRepo,
			container.Global().BucketModelProxy,
		),
	}
	dag := &entity.Dag{
		BaseInfo: entity.BaseInfo{
			ID: workflow.DagConfigBucketForDefaultBackupSetting,
		},
		Name: workflow.DagConfigBucketForDefaultBackupSetting,
		Vars: entity.DagVars{
			workflow.KeyBackupSettingId: {},
			workflow.KeyRegion:          {},
			workflow.KeyNetworkNodeRole: {},
		},
		Status: entity.DagStatusNormal,
		Tasks: []entity.Task{
			{
				ID:         workflow.ActionCreateAndCheckBucketReady,
				ActionName: workflow.ActionCreateAndCheckBucketReady,
				Params: map[string]interface{}{
					workflow.KeyBackupSettingId: fmt.Sprintf("{{%v}}", workflow.KeyBackupSettingId),
					workflow.KeyRegion:          fmt.Sprintf("{{%v}}", workflow.KeyRegion),
				},
				TimeoutSecs: 3 * 60,
			},
			{
				ID:         workflow.ActionAddNodeRoleToBucketPolicy,
				ActionName: workflow.ActionAddNodeRoleToBucketPolicy,
				Params: map[string]interface{}{
					workflow.KeyBackupSettingId: fmt.Sprintf("{{%v}}", workflow.KeyBackupSettingId),
					workflow.KeyRegion:          fmt.Sprintf("{{%v}}", workflow.KeyRegion),
					workflow.KeyNetworkNodeRole: fmt.Sprintf("{{%v}}", workflow.KeyNetworkNodeRole),
				},
				DependOn:    []string{workflow.ActionCreateAndCheckBucketReady},
				TimeoutSecs: 30,
			},
			{
				ID:         workflow.ActionCreateBackupSettingFinalStep,
				ActionName: workflow.ActionCreateBackupSettingFinalStep,
				Params: map[string]interface{}{
					workflow.KeyBackupSettingId: fmt.Sprintf("{{%v}}", workflow.KeyBackupSettingId),
				},
				DependOn:    []string{workflow.ActionAddNodeRoleToBucketPolicy},
				TimeoutSecs: 30,
			},
		},
	}
	return dag, actions
}
