package dag

import (
	"fmt"

	"github.com/tidbcloud/fastflow/pkg/entity"

	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/service/workflow/action"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/service/workflow/common"
	"github.com/tidbcloud/tidb-management-service/utilities/workflow"
)

func ApplyGKEHeterogeneousDeployDag() *entity.Dag {
	return &entity.Dag{
		BaseInfo: entity.BaseInfo{ID: common.ApplyGKEHeterogeneousDeploy},
		Name:     common.ApplyGKEHeterogeneousDeploy,
		Status:   entity.DagStatusNormal,
		Vars: map[string]entity.DagVar{
			workflow.KeyTraceId:                {},
			workflow.KeyRequestMeta:            {},
			common.KeyGKEHeterogeneousApplyReq: {},
		},
		Tasks: []entity.Task{
			{
				ID:         action.EnableGKEPolicyControlActionName,
				ActionName: action.EnableGKEPolicyControlActionName,
				Params: map[string]any{
					common.ScaleTaskKeyRequestBody: fmt.Sprintf("{{%s}}", common.KeyGKEHeterogeneousApplyReq),
				},
			},
			{
				ID:          action.PollUntilGKEPolicyControlEnabledActionName,
				ActionName:  action.PollUntilGKEPolicyControlEnabledActionName,
				TimeoutSecs: 240,
				Params: map[string]any{
					common.ScaleTaskKeyRequestBody: fmt.Sprintf("{{%s}}", common.KeyGKEHeterogeneousApplyReq),
				},
				DependOn: []string{action.EnableGKEPolicyControlActionName},
			},
			{
				ID:         action.ApplyGKEHeterogeneousDeployResourcesActionName,
				ActionName: action.ApplyGKEHeterogeneousDeployResourcesActionName,
				Params: map[string]any{
					common.ScaleTaskKeyRequestBody: fmt.Sprintf("{{%s}}", common.KeyGKEHeterogeneousApplyReq),
				},
				DependOn: []string{action.PollUntilGKEPolicyControlEnabledActionName},
			},
			{
				ID:         action.PollUntilGKEHeterogeneousDeployReadyForGatekeeperActionName,
				ActionName: action.PollUntilGKEHeterogeneousDeployReadyForGatekeeperActionName,
				Params: map[string]any{
					common.ScaleTaskKeyRequestBody: fmt.Sprintf("{{%s}}", common.KeyGKEHeterogeneousApplyReq),
				},
				DependOn: []string{action.ApplyGKEHeterogeneousDeployResourcesActionName},
			},
			{
				ID:         action.CreateGKEHeterogeneousGatekeeperAssignActionName,
				ActionName: action.CreateGKEHeterogeneousGatekeeperAssignActionName,
				Params: map[string]any{
					common.ScaleTaskKeyRequestBody: fmt.Sprintf("{{%s}}", common.KeyGKEHeterogeneousApplyReq),
				},
				DependOn: []string{action.PollUntilGKEHeterogeneousDeployReadyForGatekeeperActionName},
			},
		},
	}
}

func DeleteGKEHeterogeneousDeployDag() *entity.Dag {
	return &entity.Dag{
		BaseInfo: entity.BaseInfo{ID: common.DeleteGKEHeterogeneousDeploy},
		Name:     common.DeleteGKEHeterogeneousDeploy,
		Status:   entity.DagStatusNormal,
		Vars: map[string]entity.DagVar{
			workflow.KeyTraceId:                 {},
			workflow.KeyRequestMeta:             {},
			common.KeyGKEHeterogeneousDeleteReq: {},
		},
		Tasks: []entity.Task{
			{
				ID:         action.DeleteGKEHeterogeneousGatekeeperAssignActionName,
				ActionName: action.DeleteGKEHeterogeneousGatekeeperAssignActionName,
				Params: map[string]any{
					common.ScaleTaskKeyRequestBody: fmt.Sprintf("{{%s}}", common.KeyGKEHeterogeneousDeleteReq),
				},
			},
			{
				ID:         action.DeleteGKEHeterogeneousDeployActionName,
				ActionName: action.DeleteGKEHeterogeneousDeployActionName,
				Params: map[string]any{
					common.ScaleTaskKeyRequestBody: fmt.Sprintf("{{%s}}", common.KeyGKEHeterogeneousDeleteReq),
				},
				DependOn: []string{action.DeleteGKEHeterogeneousGatekeeperAssignActionName},
			},
		},
	}
}
