package control

import (
	"fmt"
	"strings"
)

type Description struct {
	Short string
	Usage []string
}

type Command interface {
	Name() string
	Description() Description
	Execute(args []string) error
}

var (
	commandRegistry = make(map[string]Command)
)

func RegisterCommand(cmd Command) error {
	entry := strings.ToLower(cmd.Name())
	if len(entry) == 0 {
		return newError("empty command name")
	}
	commandRegistry[entry] = cmd
	return nil
}

func GetCommand(name string) Command {
	cmd, found := commandRegistry[name]
	if !found {
		return nil
	}
	return cmd
}

type hiddenCommand interface {
	Hidden() bool
}

func PrintUsage() {
	for name, cmd := range commandRegistry {
		if _, ok := cmd.(hiddenCommand); ok {
			continue
		}
		fmt.Println("   ", name, "\t\t\t", cmd.Description())
	}
}