package tools

import (
	"log/slog"
	"maps"
	"sync"

	"github.com/vaayne/mcphub/internal/config"
)

// BuiltinToolRegistry manages built-in tools
type BuiltinToolRegistry struct {
	logger *slog.Logger
	tools  map[string]config.BuiltinTool
	mu     sync.RWMutex
}

// NewBuiltinToolRegistry creates a new registry
func NewBuiltinToolRegistry(logger *slog.Logger) *BuiltinToolRegistry {
	return &BuiltinToolRegistry{
		logger: logger,
		tools:  make(map[string]config.BuiltinTool),
	}
}

// RegisterTool adds a tool to the registry
func (r *BuiltinToolRegistry) RegisterTool(tool config.BuiltinTool) {
	r.mu.Lock()
	defer r.mu.Unlock()
	r.logger.Info("Registering built-in tool", slog.String("name", tool.Name))
	r.tools[tool.Name] = tool
}

// GetTool retrieves a tool from the registry
func (r *BuiltinToolRegistry) GetTool(name string) (config.BuiltinTool, bool) {
	r.mu.RLock()
	defer r.mu.RUnlock()
	tool, exists := r.tools[name]
	return tool, exists
}

// GetAllTools returns all registered tools
func (r *BuiltinToolRegistry) GetAllTools() map[string]config.BuiltinTool {
	r.mu.RLock()
	defer r.mu.RUnlock()
	// Return a copy to prevent external modification
	toolsCopy := make(map[string]config.BuiltinTool, len(r.tools))
	maps.Copy(toolsCopy, r.tools)
	return toolsCopy
}
