package dag

import (
	"fmt"

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

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

func UpdateClusterTopologyDag() *entity.Dag {
	dag := &entity.Dag{
		BaseInfo: entity.BaseInfo{
			ID: common.UpdateClusterTopology,
		},
		Name:   common.UpdateClusterTopology,
		Status: entity.DagStatusNormal,
		Vars: map[string]entity.DagVar{
			workflow.KeyTraceId:                          {},
			common.KeyClusterId:                          {},
			common.KeyTidbGroupIds:                       {},
			common.KeyResourcePoolId:                     {},
			common.KeyTargetStatus:                       {},
			common.KeyEventName:                          {},
			common.KeyOldMaxRcu:                          {},
			common.KeyNewMaxRcu:                          {},
			common.KeyPreviousReservedCapacityTemplateId: {},
			common.KeyReservedCapacityTemplateId:         {},
			workflow.KeyRequestMeta:                      {},
		},
		Tasks: []entity.Task{
			{
				ID:         action.UpdateSharedPoolPD,
				ActionName: action.UpdateSharedPoolPD,
				Params: map[string]any{
					common.KeyClusterId: fmt.Sprintf("{{%s}}", common.KeyClusterId),
				},
			},
			{
				ID:         action.UpdateSharedPoolTiKV,
				ActionName: action.UpdateSharedPoolTiKV,
				Params: map[string]any{
					common.KeyClusterId: fmt.Sprintf("{{%s}}", common.KeyClusterId),
				},
				DependOn: []string{action.UpdateSharedPoolPD},
			},
			{
				ID:         action.UpdateSharedPoolTiKVWorker,
				ActionName: action.UpdateSharedPoolTiKVWorker,
				Params: map[string]any{
					common.KeyClusterId: fmt.Sprintf("{{%s}}", common.KeyClusterId),
				},
				DependOn: []string{action.UpdateSharedPoolTiKV},
			},
			{
				ID:         action.UpdateSharedPoolTiDBWorker,
				ActionName: action.UpdateSharedPoolTiDBWorker,
				Params: map[string]any{
					common.KeyClusterId: fmt.Sprintf("{{%s}}", common.KeyClusterId),
				},
				DependOn: []string{action.UpdateSharedPoolTiKVWorker},
			},
			{
				ID:         action.UpdateTiDBGroupTiDB,
				ActionName: action.UpdateTiDBGroupTiDB,
				Params: map[string]any{
					common.KeyClusterId: fmt.Sprintf("{{%s}}", common.KeyClusterId),
				},
				DependOn: []string{action.UpdateSharedPoolTiDBWorker},
			},
			{
				ID:         action.UpdateTiDBGroupTiProxy,
				ActionName: action.UpdateTiDBGroupTiProxy,
				Params: map[string]any{
					common.KeyClusterId: fmt.Sprintf("{{%s}}", common.KeyClusterId),
				},
				DependOn: []string{action.UpdateTiDBGroupTiDB},
			},
			{
				ID:         action.PollResourcePoolUntilAvailable,
				ActionName: action.PollResourcePoolUntilAvailable,
				Params: map[string]any{
					common.KeyResourcePoolId: fmt.Sprintf("{{%s}}", common.KeyResourcePoolId),
				},
				DependOn: []string{action.UpdateTiDBGroupTiProxy},
			},
			{
				ID:         action.PollClusterUntilAvailable,
				ActionName: action.PollClusterUntilAvailable,
				Params: map[string]any{
					common.KeyClusterId:    fmt.Sprintf("{{%s}}", common.KeyClusterId),
					common.KeyTidbGroupIds: fmt.Sprintf("{{%s}}", common.KeyTidbGroupIds),
				},
				DependOn: []string{action.PollResourcePoolUntilAvailable},
			},
			{
				ID:         action.PollTidbGroupUntilAvailable,
				ActionName: action.PollTidbGroupUntilAvailable,
				Params: map[string]any{
					common.KeyClusterId:    fmt.Sprintf("{{%s}}", common.KeyClusterId),
					common.KeyTidbGroupIds: fmt.Sprintf("{{%s}}", common.KeyTidbGroupIds),
				},
				DependOn: []string{action.PollClusterUntilAvailable},
			},
			{
				ID:         action.SetGlobalClusterStatus,
				ActionName: action.SetGlobalClusterStatus,
				Params: map[string]any{
					common.KeyClusterId:    fmt.Sprintf("{{%s}}", common.KeyClusterId),
					common.KeyTargetStatus: fmt.Sprintf("{{%s}}", common.KeyTargetStatus),
					common.KeyEventName:    fmt.Sprintf("{{%s}}", common.KeyEventName),
					common.KeyOldMaxRcu:    fmt.Sprintf("{{%s}}", common.KeyOldMaxRcu),
					common.KeyNewMaxRcu:    fmt.Sprintf("{{%s}}", common.KeyNewMaxRcu),
				},
				DependOn: []string{action.PollTidbGroupUntilAvailable},
			},
		},
	}

	return dag
}
