package hhn.temp.project; import java.util.Scanner; import java.util.concurrent.atomic.AtomicBoolean; public class UserCommands implements Runnable { private Scanner scanner; private AssignmentManager manager; private Integer selectedTaskId = null; private Integer selectedWorkerId = null; private AtomicBoolean running = new AtomicBoolean(false); private Thread cliThread; private enum InputState { MAIN_MENU, TASK_SELECTED, WORKER_SELECTED, AWAITING_EDIT_INPUT, AWAITING_CREATE_TASK_WORKER, AWAITING_CREATE_TASK_NAME, AWAITING_CREATE_TASK_DESC, AWAITING_CREATE_WORKER_NAME, AWAITING_TASK_SELECTION } private InputState currentState = InputState.MAIN_MENU; private Integer tempWorkerId = null; private String tempTaskName = null; public UserCommands(AssignmentManager manager) { this.manager = manager; } @Override public void run() { scanner = new Scanner(System.in); running.set(true); while (running.get()) { printPrompt(); String input = scanner.nextLine().trim(); if ("exit".equalsIgnoreCase(input)) { stop(); continue; } handleInput(input); } scanner.close(); } public void start() { if (cliThread == null || !cliThread.isAlive()) { cliThread = new Thread(this, "CLI-Thread"); cliThread.start(); } } public void stop() { running.set(false); if (cliThread != null) { cliThread.interrupt(); } } private void printPrompt() { if (!running.get()) return; switch (currentState) { case MAIN_MENU: System.out.println("Type '?' or 'help' for a list of commands"); break; case TASK_SELECTED: System.out.println("Task " + selectedTaskId + " selected. Commands: finish, unfinish, remove, edit, back"); break; case WORKER_SELECTED: if (selectedWorkerId != null) { System.out.println("Worker " + selectedWorkerId + " selected. Commands: remove, back"); } else { System.out.println("Enter worker ID to select (or 'back'):"); } break; case AWAITING_EDIT_INPUT: System.out.println("Enter new name;description:"); break; case AWAITING_CREATE_WORKER_NAME: System.out.println("Enter worker name:"); break; case AWAITING_CREATE_TASK_WORKER: System.out.println("Enter worker ID:"); break; case AWAITING_CREATE_TASK_NAME: System.out.println("Enter task name:"); break; case AWAITING_CREATE_TASK_DESC: System.out.println("Enter task description:"); break; } System.out.print("> "); } public void handleInput(String input) { if (input == null || input.isEmpty()) { return; } if ("?".equals(input) || "help".equalsIgnoreCase(input)) { showHelp(); return; } try { switch (currentState) { case MAIN_MENU: handleMainMenuInput(input); break; case TASK_SELECTED: handleTaskSelectionInput(input); break; case WORKER_SELECTED: handleWorkerSelectionInput(input); break; case AWAITING_EDIT_INPUT: handleEditInput(input); break; case AWAITING_CREATE_TASK_WORKER: handleCreateTaskWorkerInput(input); break; case AWAITING_CREATE_TASK_NAME: handleCreateTaskNameInput(input); break; case AWAITING_CREATE_TASK_DESC: handleCreateTaskDescInput(input); break; case AWAITING_CREATE_WORKER_NAME: handleCreateWorkerNameInput(input); break; case AWAITING_TASK_SELECTION: handleTaskIdInput(input); break; } } catch (Exception e) { System.out.println("Error: " + e.getMessage()); resetToMainMenu(); } } private void showHelp() { System.out.println("=== Available Commands ==="); System.out.println("General:"); System.out.println(" help, ? - Show this help"); System.out.println(" exit - Exit the program"); System.out.println(" listworkers - List all workers and select one"); System.out.println(" selecttask - Select a task by ID"); System.out.println(" createtask - Create a new task"); System.out.println(" createworker - Create a new worker"); System.out.println(" listtasks - List all tasks"); System.out.println(" listunfinished - List unfinished tasks"); System.out.println(" listfinished - List finished tasks"); System.out.println("\nWhen a task is selected:"); System.out.println(" finish - Mark task as finished"); System.out.println(" unfinish - Mark task as unfinished"); System.out.println(" remove - Remove the task"); System.out.println(" edit - Edit task name and description"); System.out.println(" back - Return to main menu"); System.out.println("\nWhen a worker is selected:"); System.out.println(" remove - Remove the worker"); System.out.println(" back - Return to main menu"); } private void handleMainMenuInput(String input) { switch (input.toLowerCase()) { case "createworker": System.out.println("Enter worker name:"); currentState = InputState.AWAITING_CREATE_WORKER_NAME; break; case "createtask": System.out.println("Enter worker ID:"); currentState = InputState.AWAITING_CREATE_TASK_WORKER; break; case "selecttask": System.out.println("Enter task ID:"); currentState = InputState.AWAITING_TASK_SELECTION; // Change to new state break; case "listworkers": System.out.println("Available workers:"); for (Worker w : manager.getWorkerMap().values()) { System.out.println(" " + w.getId() + ": " + w.getName()); } System.out.println("Enter worker ID to select (or 'back'):"); currentState = InputState.WORKER_SELECTED; break; default: System.out.println("Unknown command. Type 'help' for available commands."); } } private void handleWorkerSelectionInput(String input) { if ("back".equalsIgnoreCase(input)) { resetToMainMenu(); return; } try { int workerId = Integer.parseInt(input.trim()); Worker worker = manager.getWorker(workerId); if (worker != null) { selectedWorkerId = workerId; System.out.println("Worker " + workerId + " (" + worker.getName() + ") selected"); System.out.println("Commands: remove, back"); } else { System.out.println("Worker not found. Please enter a valid worker ID:"); } } catch (NumberFormatException e) { if (selectedWorkerId != null) { handleWorkerCommand(input); } else { System.out.println("Invalid input. Please enter a worker ID or 'back':"); } } } private void handleWorkerCommand(String input) { switch (input.toLowerCase()) { case "remove": manager.removeWorker(selectedWorkerId); System.out.println("Worker removed"); resetToMainMenu(); break; case "back": resetToMainMenu(); break; default: System.out.println("Unknown command. Available commands: remove, back"); } } private void handleCreateWorkerNameInput(String input) { int workerId = manager.createWorker(input.trim()); System.out.println("Created worker with ID: " + workerId); resetToMainMenu(); } private void handleTaskIdInput(String input) { if ("back".equalsIgnoreCase(input)) { resetToMainMenu(); return; } try { int taskId = Integer.parseInt(input.trim()); Task task = manager.getTask(taskId); if (task != null) { selectedTaskId = taskId; currentState = InputState.TASK_SELECTED; System.out.println("Task " + taskId + " (" + task.getName() + ") selected"); System.out.println("Commands: finish, unfinish, remove, edit, back"); } else { System.out.println("Task not found. Please enter a valid task ID:"); } } catch (NumberFormatException e) { System.out.println("Invalid input. Please enter a task ID or 'back':"); } } private void handleCreateTaskWorkerInput(String input) { try { tempWorkerId = Integer.parseInt(input.trim()); System.out.println("Enter task name:"); currentState = InputState.AWAITING_CREATE_TASK_NAME; } catch (NumberFormatException e) { System.out.println("Invalid worker ID. Please enter a number:"); } } private void handleCreateTaskNameInput(String input) { tempTaskName = input.trim(); System.out.println("Enter task description:"); currentState = InputState.AWAITING_CREATE_TASK_DESC; } private void handleCreateTaskDescInput(String input) { int taskId = manager.addTask(tempWorkerId, tempTaskName, input.trim()); System.out.println("Created task with ID: " + taskId); resetToMainMenu(); } private void resetToMainMenu() { currentState = InputState.MAIN_MENU; selectedTaskId = null; selectedWorkerId = null; tempWorkerId = null; tempTaskName = null; } private void handleTaskSelectionInput(String input) { if ("back".equalsIgnoreCase(input)) { resetToMainMenu(); return; } try { int taskId = Integer.parseInt(input.trim()); Task task = manager.getTask(taskId); if (task != null) { selectedTaskId = taskId; currentState = InputState.TASK_SELECTED; System.out.println("Task " + taskId + " (" + task.getName() + ") selected"); System.out.println("Commands: finish, unfinish, remove, edit, back"); } else { System.out.println("Task not found. Please enter a valid task ID:"); } } catch (NumberFormatException e) { if (selectedTaskId != null) { handleTaskCommand(input); } else { System.out.println("Invalid input. Please enter a task ID or 'back':"); } } } private void handleTaskCommand(String input) { switch (input.toLowerCase()) { case "finish": manager.finishTask(manager.getTask(selectedTaskId).getWorkerId(),selectedTaskId); System.out.println("Task marked as finished"); break; case "unfinish": manager.unfinishTask(manager.getTask(selectedTaskId).getWorkerId(),selectedTaskId); System.out.println("Task marked as unfinished"); break; case "remove": manager.removeTask(selectedTaskId); System.out.println("Task removed"); resetToMainMenu(); break; case "edit": System.out.println("Enter new name;description:"); currentState = InputState.AWAITING_EDIT_INPUT; break; case "back": resetToMainMenu(); break; default: System.out.println("Unknown command. Type 'help' for available commands."); } } private void handleEditInput(String input) { String[] parts = input.split(";", 2); if (parts.length == 2) { manager.editTask(manager.getTask(selectedTaskId).getWorkerId(), selectedTaskId, parts[0], parts[1]); System.out.println("Task edited"); } else { System.out.println("Invalid format. Use: name;description"); System.out.println("Please try again:"); return; } currentState = InputState.TASK_SELECTED; } public Scanner getScanner() { return scanner; } //only for testing public void setScanner(Scanner scanner) { this.scanner = scanner; } //only for testing public boolean isRunning() { return running.get(); } }