package action

import (
	"fmt"
	"regexp"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
)

type Registry struct {
	Actions map[cloudv1.WorkflowActionName]Action // key: name
}

var (
	DefaultRegistry = &Registry{
		Actions: make(map[cloudv1.WorkflowActionName]Action),
	}
	actionNameRegex = regexp.MustCompile(`^[a-zA-Z][a-zA-Z0-9-_]*[a-zA-Z0-9]+$`)
)

func RegisterWorkflowAction(action Action) {
	name := action.Name()
	if !actionNameRegex.MatchString(string(name)) {
		panic(fmt.Sprintf("RegisterWorkflowAction: invalid action name: %s", name))
	}
	if _, ok := DefaultRegistry.Actions[name]; ok {
		panic(fmt.Sprintf("RegisterWorkflowAction: duplicated workflow action register: %s", name))
	}
	DefaultRegistry.Actions[action.Name()] = action
}
