package internal.hw.crawler; import internal.hw.crawler.commands.Command; import internal.hw.crawler.commands.CommandArg; import internal.hw.crawler.views.ConsoleView; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class MainController { private final Map commands = new HashMap<>(); private final ConsoleView view; public MainController(ConsoleView view) { this.view = view; } public Map getCommands() { return Collections.unmodifiableMap(commands); } public void registerCommand(Command command) { commands.put(command.getName(), command); } public void handleInput(String input) { String text = input == null ? "" : input.trim(); if (text.isEmpty()) { return; } String[] args = text.split("\\s+"); String cmdName = args[0].toLowerCase(); Command command = commands.get(cmdName); if (command == null) { view.printError("Unknown command: " + cmdName); return; } if (!validateArgs(command, args)) { return; } try { command.execute(args); } catch (Exception e) { view.printError("Command failed: " + e.getMessage()); } } private boolean validateArgs(Command command, String[] args) { List cmdArgs = command.getArgs(); long required = cmdArgs.stream().filter(CommandArg::required).count(); int provided = args.length - 1; if (provided < required) { view.printError("Usage: " + command.getName() + " " + formatUsage(cmdArgs)); return false; } return true; } private String formatUsage(List cmdArgs) { StringBuilder sb = new StringBuilder(); for (CommandArg arg : cmdArgs) { if (arg.required()) { sb.append("<").append(arg.name()).append("> "); } else { sb.append("[").append(arg.name()).append("] "); } } return sb.toString().trim(); } }