package registry

import (
	"sort"

	"ops-assistant/internal/core/command"
)

type Handler func(userID int64, cmd *command.ParsedCommand) (string, error)

type Registry struct {
	handlers       map[string]Handler
	moduleHandlers map[string]Handler
}

func New() *Registry {
	return &Registry{handlers: map[string]Handler{}, moduleHandlers: map[string]Handler{}}
}

func (r *Registry) Register(name string, h Handler) {
	r.handlers[name] = h
}

func (r *Registry) RegisterModule(module string, h Handler) {
	r.moduleHandlers[module] = h
}

func (r *Registry) Handle(userID int64, cmd *command.ParsedCommand) (string, bool, error) {
	if h, ok := r.handlers[cmd.Name]; ok {
		out, err := h(userID, cmd)
		return out, true, err
	}
	if h, ok := r.moduleHandlers[cmd.Module]; ok {
		out, err := h(userID, cmd)
		return out, true, err
	}
	return "", false, nil
}

func (r *Registry) ListModules() []string {
	mods := make([]string, 0, len(r.moduleHandlers))
	for m := range r.moduleHandlers {
		mods = append(mods, m)
	}
	sort.Strings(mods)
	return mods
}
