import java.util.*; import java.io.*; class SystemController { private Scanner scanner = new Scanner(System.in); private Map users = new HashMap<>(); private final String USERS_FILE = "src/users.txt"; public static Inventory inventory = new Inventory(); private Menu menu = new Menu(); private FinancialManager financialManager = new FinancialManager(); private ReservationManager reservationManager = new ReservationManager(); public SystemController() { loadUsersFromFile(); } public void startSystem() { System.out.println("Willkommen im Restaurant Management System!"); System.out.println("Bitte loggen Sie sich ein: "); System.out.print("Username ---------------> "); String username = scanner.nextLine(); System.out.print("Passwort ---------------> "); String password = scanner.nextLine(); User user = authenticate(username, password); if (user != null) { displayMainMenu(user); } else { System.out.println("Ungültige Anmeldedaten."); } } private User authenticate(String username, String password) { if (users.containsKey(username) && users.get(username).password.equals(password)) { return users.get(username); } return null; } public void displayMainMenu(User user) { boolean running = true; while (running) { System.out.println("\n--- Hauptmenü ---"); System.out.println("1. Bestand verwalten"); System.out.println("2. Neuer Nutzer erstellen"); System.out.println("3. Menü anzeigen"); System.out.println("4. Bestellungen verwalten"); System.out.println("5. Finanzbericht anzeigen"); System.out.println("6. Reservierungen verwalten"); System.out.println("7. Beenden"); System.out.print("Bitte wähle eine Option: "); int choice = scanner.nextInt(); scanner.nextLine(); switch (choice) { case 1 -> manageInventory(); case 2 -> { if (user.role == Role.MANAGER) { createUser(); } else { System.out.println("Keine Rechte, um neue Nutzer zu erstellen."); } } case 3 -> menu.displayMenu(inventory); case 4 -> manageOrders(); case 5 -> showFinancialReports(); case 6 -> manageReservations(user); case 7 -> { running = false; System.out.println("System wird beendet. Auf Wiedersehen!"); } default -> System.out.println("Ungültige Auswahl. Bitte versuche es erneut."); } } } private void manageReservations(User user) { boolean managingReservations = true; while (managingReservations) { System.out.println("\n--- Reservierungen verwalten ---"); System.out.println("1. Reservierung erstellen"); System.out.println("2. Reservierung bearbeiten"); System.out.println("3. Reservierung stornieren"); System.out.println("4. Reservierungen anzeigen"); System.out.println("5. Zurück zum Hauptmenü"); System.out.print("Bitte wähle eine Option: "); int choice = scanner.nextInt(); scanner.nextLine(); switch (choice) { case 1 -> { if (user.role == Role.MANAGER || user.role == Role.SERVICE) { createReservation(); } else { System.out.println("Keine Rechte, um neue Reservierungen zu erstellen."); } } case 2 -> { if (user.role == Role.MANAGER || user.role == Role.SERVICE) { editReservation(); } else { System.out.println("Keine Rechte, um Reservierungen zu bearbeiten."); } } case 3 -> { if (user.role == Role.MANAGER || user.role == Role.SERVICE) { cancelReservation(); } else { System.out.println("Keine Rechte, um Reservierungen zu stornieren."); } } case 4 -> reservationManager.displayTableOverview(); case 5 -> managingReservations = false; default -> System.out.println("Ungültige Auswahl. Bitte versuche es erneut."); } } } private void createReservation() { System.out.print("Tischnummer: "); int tableNumber = scanner.nextInt(); scanner.nextLine(); System.out.print("Kundenname: "); String customerName = scanner.nextLine(); reservationManager.createReservation(tableNumber, customerName); } private void editReservation() { System.out.print("Tischnummer der Reservierung: "); int tableNumber = scanner.nextInt(); scanner.nextLine(); System.out.print("Neuer Kundenname: "); String newCustomerName = scanner.nextLine(); reservationManager.editReservation(tableNumber, newCustomerName); } private void cancelReservation() { System.out.print("Tischnummer der Reservierung: "); int tableNumber = scanner.nextInt(); reservationManager.cancelReservation(tableNumber); } private void manageInventory() { boolean managingInventory = true; while (managingInventory) { inventory.loadStockFromFile(); System.out.println("\n--- Bestand verwalten ---"); System.out.println("1. Bestand ansehen"); System.out.println("2. Bestand ändern"); System.out.println("3. Bestand erweitern"); System.out.println("4. Zurück zum Hauptmenü"); System.out.print("Bitte wähle eine Option: "); int choice = scanner.nextInt(); scanner.nextLine(); // Eingabepuffer leeren switch (choice) { case 1 -> inventory.viewStock(); // Bestand ansehen case 2 -> { System.out.println("Welchen Bestand möchten Sie ändern?"); String name = scanner.nextLine(); System.out.println("Neue Anzahl ---->"); try { int anzahl = scanner.nextInt(); inventory.overwriteStock(name, anzahl); // Bestellungen im Speicher anzeigen inventory.saveStockToFile(); // Echtzeitspeicherung der Daten } catch (IllegalArgumentException e) { System.out.println("Fehler! Überprüfen Sie Ihre Eingabe"); } } case 3 -> { System.out.println("Bestand wird erweitert....."); System.out.println("Name des Produkts: "); String name = scanner.nextLine(); System.out.println("Anzahl :"); try { int anzahl = scanner.nextInt(); inventory.addIngredients(name, anzahl); // Bestellungen im Speicher anzeigen inventory.saveStockToFile(); // Echtzeitspeicherung der Daten } catch (IllegalArgumentException e) { System.out.println("Fehler! Überprüfen Sie Ihre Eingabe"); } } case 4 -> managingInventory = false; default -> System.out.println("Ungültige Auswahl. Bitte versuche es erneut."); } } } private void manageOrders() { boolean managingOrders = true; while (managingOrders) { System.out.println("\n--- Bestellungen verwalten ---"); System.out.println("1. Bestellung aufnehmen"); System.out.println("2. Alle Bestellungen anzeigen"); System.out.println("3. Bestellungen löschen"); System.out.println("4. Zurück zum Hauptmenü"); System.out.print("Bitte wähle eine Option: "); int choice = scanner.nextInt(); scanner.nextLine(); // Eingabepuffer leeren switch (choice) { case 1 -> { menu.displayMenu(inventory); Bestellsystem.erstelleBestellung(); // Neue Bestellung erstellen } case 2 -> { Bestellsystem.ladeUndZeigeBestellungen(); // Bestellungen aus Datei anzeigen } case 3 -> { Bestellsystem.loescheBestellung(); // Bestellungen aus Datei löschen } case 4 -> managingOrders = false; default -> System.out.println("Ungültige Auswahl. Bitte versuche es erneut."); } } } private void createUser() { String username = ""; String password = ""; Role role = null; try { System.out.println("\n--- Neuen Nutzer erstellen ---"); System.out.print("Benutzername: "); username = scanner.nextLine(); System.out.print("Passwort: "); password = scanner.nextLine(); System.out.print("Rolle (MANAGER, SERVICE, KITCHEN): "); role = Role.valueOf(scanner.nextLine().toUpperCase()); } catch (IllegalArgumentException d) { System.out.println("Fehler beim Erstellen eines Accounts. Überprüfen Sie Ihre Eingaben."); } catch (NullPointerException c) { System.out.println("Fehler beim Erstellen eines Accounts. Überprüfen Sie Ihre Eingaben."); } try { User newUser = new User(username, password, role); users.put(username, newUser); saveUserToFile(newUser); System.out.println("Nutzer erfolgreich erstellt."); } catch (NullPointerException c) { System.out.println("Fehler beim Erstellen eines Accounts."); } } private void loadUsersFromFile() { try (BufferedReader reader = new BufferedReader(new FileReader(USERS_FILE))) { String line; while ((line = reader.readLine()) != null) { String[] parts = line.split(":"); if (parts.length == 3) { String username = parts[0]; String password = parts[1]; Role role = Role.valueOf(parts[2].toUpperCase()); users.put(username, new User(username, password, role)); } } } catch (FileNotFoundException e) { System.out.println("Benutzerdatenbank nicht gefunden. Standard-Manager wird erstellt."); createDefaultManager(); } catch (IOException e) { System.out.println("Fehler beim Lesen der Benutzerdatenbank: " + e.getMessage()); } } private void saveUserToFile(User user) { try (BufferedWriter writer = new BufferedWriter(new FileWriter(USERS_FILE, true))) { writer.write(user.username + ":" + user.password + ":" + user.role.name()); writer.newLine(); } catch (IOException e) { System.out.println("Fehler beim Speichern des Nutzers: " + e.getMessage()); } } private void createDefaultManager() { User defaultManager = new User("Dimitry", "1234", Role.MANAGER); users.put("Dimitry", defaultManager); saveUserToFile(defaultManager); } private void showFinancialReports() { System.out.println("\n--- Finanzbericht ---"); System.out.println("Wählen Sie den Zeitraum:"); System.out.println("1. Täglich"); System.out.println("2. Wöchentlich"); System.out.println("3. Monatlich"); int periodChoice = scanner.nextInt(); scanner.nextLine(); // Eingabepuffer leeren switch (periodChoice) { case 1 -> financialManager.showFinancialReport("daily"); case 2 -> financialManager.showFinancialReport("weekly"); case 3 -> financialManager.showFinancialReport("monthly"); default -> System.out.println("Ungültige Auswahl."); } } }