//nolint:gomnd,funlen
package pit

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_base "github.com/tidbcloud/dataflow-service/app/workflow/action/backup/base"
	pit_common "github.com/tidbcloud/dataflow-service/app/workflow/action/backup/pit/common"
	pit_enable "github.com/tidbcloud/dataflow-service/app/workflow/action/backup/pit/enable"
	crrf_auto "github.com/tidbcloud/dataflow-service/app/workflow/action/crrf/auto"
)

func GetEnableDag() (*entity.Dag, []run.Action) {
	base := backup_base.NewBaseAction(
		container.Global().TransProvider,
		container.Global().BackupRepo,
		container.Global().BackupScheduleRepo,
		container.Global().LogBackupRepo,
		container.Global().BackupRegionalFacade,
		container.Global().ClusterJobModel,
		container.Global().MgmtSvcGrpcClient,
		container.Global().PitBackupSwitchRepo,
		container.Global().FeatureGate,
	)

	actions := []run.Action{
		pit_enable.NewStopGCAction(base, container.Global().TiDBClusterGCSwitchModel),
		pit_enable.NewDoSnapshotBackupAction(
			base, container.Global().SnapshotBackupModel, container.Global().WorkflowModel),
		pit_enable.NewStartLogBackupAction(
			base, container.Global().Encryptor, container.Global().BucketRepo,
			container.Global().ConfigCenterManager, container.Global().TiDBClusterInfraClient),
		pit_enable.NewStartGCActionAction(base, container.Global().TiDBClusterGCSwitchModel),
		pit_enable.NewUpdateSwitchStatusToEnabledAction(base, container.Global().PitBackupSwitchRepo),
		action.MustNewActionWrapperV2(crrf_auto.NewAutoCRRFEnableFromPitAction(
			container.Global().BackupSettingRepo,
			container.Global().PitBackupSwitchRepo,
			container.Global().MgmtSvcGrpcClient,
			container.Global().CRRFModel,
		), action.SetRunAfterRetryFun(crrf_auto.RetryFunc)),
		pit_common.NewUpdateBackupSettingStatusToNormalAction(base,
			container.Global().BackupSettingRepo,
			container.Global().BackupSettingModel),
	}
	dag := &entity.Dag{
		BaseInfo: entity.BaseInfo{
			ID: workflow.DagEnablePitBackup,
		},
		Name: workflow.DagEnablePitBackup,
		Vars: entity.DagVars{
			workflow.KeyPitBackupSwitchID:    {},
			workflow.KeyEnableLogBackupID:    {},
			workflow.KeyAsyncCreateBackupReq: {},
		},
		Status: entity.DagStatusNormal,
		Tasks: []entity.Task{
			{
				ID:          workflow.ActionStopGCForPitBackup,
				ActionName:  workflow.ActionStopGCForPitBackup,
				TimeoutSecs: 5 * 60,
			},
			{
				ID:          workflow.ActionDoSnapshotBackup,
				ActionName:  workflow.ActionDoSnapshotBackup,
				DependOn:    []string{workflow.ActionStopGCForPitBackup},
				TimeoutSecs: 60 * 60 * 24 * 1, // 1 day almost no timeout, because we need wait for snapshot backup finish
			},
			{
				ID:          workflow.ActionStartLogBackup,
				ActionName:  workflow.ActionStartLogBackup,
				TimeoutSecs: 20 * 60,
				DependOn:    []string{workflow.ActionDoSnapshotBackup},
			},
			{
				ID:          workflow.ActionStartGCforPitBackup,
				ActionName:  workflow.ActionStartGCforPitBackup,
				DependOn:    []string{workflow.ActionStartLogBackup},
				TimeoutSecs: 5 * 60,
			},
			{
				ID:         workflow.ActionAutoCRRFEnableFromPit,
				ActionName: workflow.ActionAutoCRRFEnableFromPit,
				Params: map[string]interface{}{
					workflow.KeyPitBackupSwitchID: fmt.Sprintf("{{%v}}", workflow.KeyPitBackupSwitchID),
				},
				DependOn:    []string{workflow.ActionStartGCforPitBackup},
				TimeoutSecs: 60 * 60,
			},
			{
				ID:          workflow.ActionUpdatePitBackupSwitchStatusFromEnablingToEnabled,
				ActionName:  workflow.ActionUpdatePitBackupSwitchStatusFromEnablingToEnabled,
				DependOn:    []string{workflow.ActionAutoCRRFEnableFromPit},
				TimeoutSecs: 3 * 60,
			},
			{
				ID:          workflow.ActionUpdatePitBackupSettingStatusToNormal,
				ActionName:  workflow.ActionUpdatePitBackupSettingStatusToNormal,
				DependOn:    []string{workflow.ActionUpdatePitBackupSwitchStatusFromEnablingToEnabled},
				TimeoutSecs: 5 * 60,
			},
		},
	}
	return dag, actions
}
