import java.time.LocalDate; import java.util.*; import java.time.temporal.ChronoUnit; public class Ui { private final Scanner scanner = new Scanner(System.in); private final Verwaltung verwaltung; // Konstruktor, der eine Verwaltung-Instanz annimmt public Ui(Verwaltung verwaltung) { this.verwaltung = verwaltung; } void anmeldung() { boolean running = true; while (running) { System.out.println("Willkommen! Bitte wählen Sie eine Option:"); System.out.println("1: Durchsuchen der Medien"); System.out.println("2: Ausleihen eines Gegenstandes"); System.out.println("3: Rückgabe eines Gegenstandes"); System.out.println("4: Ausgeliehene Gegenstände und Gebühren anzeigen"); System.out.println("5: Verlängern der Leihfrist"); System.out.println("6: Verbuchen von überfälligen Gebühren (Admin)"); System.out.println("7: Registrieren"); System.out.println("8: Anmelden"); System.out.println("0: Programm beenden"); int menue = scanner.nextInt(); scanner.nextLine(); // Leert den Puffer nach nextInt() switch (menue) { case 1 -> suchenNachMedien(); // Keine Anmeldung erforderlich case 2 -> ausleihen(); case 3 -> rueckgabeDurchfuehren(); case 4 -> gebuehrenEinsehen(); case 5 -> verlaengern(); case 6 -> adminrechte(); case 7 -> registrieren(); // Registrieren case 8 -> anmelden(); // Anmelden case 0 -> { System.out.println("Programm wird beendet. Auf Wiedersehen!"); running = false; } default -> System.out.println("Ungültige Auswahl. Bitte versuchen Sie es erneut."); } } } private void suchenNachMedien() { System.out.println("Bitte geben Sie stichwortartig an, wonach Sie suchen:"); String suchbegriff = scanner.nextLine(); List gefundeneMedien = Verwaltung.durchsuchenMedien(verwaltung.mediensListe, suchbegriff); if (gefundeneMedien.isEmpty()) { System.out.println("Keine Medien gefunden."); } else { System.out.println("Gefundene Medien:"); for (Medien medien : gefundeneMedien) { System.out.print(medien.getName()); if (medien.istAusgeliehen) { // Wenn das Medium ausgeliehen ist, gibt es das Rückgabedatum an Optional ausleiheOpt = verwaltung.ausliste.stream() .filter(ausleihe -> ausleihe.getMedien().equals(medien)) .findFirst(); if (ausleiheOpt.isPresent()) { Aausleihe ausleihe = ausleiheOpt.get(); LocalDate rueckgabedatum = ausleihe.getDate().plusWeeks(medien.frist); // Berechnet das Rückgabedatum System.out.println(" ist ausgeliehen. Rückgabedatum: " + rueckgabedatum); } } else { System.out.println(" ist verfügbar."); } // Hier können noch weitere Details zum Medium ausgegeben werden, falls erforderlich System.out.println("Typ: " + medien.getClass().getSimpleName()); // Zeigt den Typ des Mediums an // Weitere Details wie Autor, Jahr, etc. je nach Medium-Typ könnten hier hinzugefügt werden } } } // Registrierungsmethode private void registrieren() { System.out.print("Geben Sie Ihren Vornamen ein: "); String name = scanner.nextLine(); System.out.print("Geben Sie Ihren Nachnamen ein: "); String nachname = scanner.nextLine(); System.out.print("Für Student geben Sie 's' und für Erwachsener 'e' ein: "); String artInput = scanner.nextLine(); // Generiere eine neue, eindeutige Kundennummer int genkundennummer = verwaltung.generiereEindeutigeKundennummer(); // Erstelle einen neuen Benutzer Benutzer neuerBenutzer = Creator.factoryBenutzer(name, nachname, genkundennummer, artInput.toLowerCase()); if (neuerBenutzer != null) { verwaltung.benutzerListe.add(neuerBenutzer); // Benutzer zur Verwaltungsliste hinzufügen System.out.println("Registrierung erfolgreich! Ihre Kundennummer lautet: " + genkundennummer); } else { System.out.println("Ungültige Art. Versuchen Sie es erneut."); } } // Anmeldemethode private Benutzer anmelden() { System.out.print("Geben Sie Ihre Kundennummer zur Anmeldung ein: "); int eingabeKundennummer = scanner.nextInt(); scanner.nextLine(); // Puffer leeren Optional benutzerOpt = verwaltung.benutzerListe.stream() .filter(benutzer -> benutzer.getKundennummer() == eingabeKundennummer) .findFirst(); if (benutzerOpt.isPresent()) { System.out.println("Willkommen zurück, " + benutzerOpt.get().getName()); return benutzerOpt.get(); } else { System.out.println("Kundennummer nicht gefunden."); return null; } } // Ausleihen eines Mediums private void ausleihen() { Benutzer benutzer = anmelden(); if (benutzer == null) { System.out.println("Sie müssen sich zuerst anmelden."); return; } System.out.print("Geben Sie die ID des gewünschten Mediums ein: "); int id = scanner.nextInt(); scanner.nextLine(); // Puffer leeren Optional optionalMedien = verwaltung.mediensListe.stream() .filter(medien -> medien.getId() == id) .findFirst(); if (optionalMedien.isPresent()) { Medien medien = optionalMedien.get(); if (!medien.istAusgeliehen()) { LocalDate heute = LocalDate.now(); verwaltung.addAL(medien, benutzer, heute, null); System.out.println("Das Medium wurde erfolgreich ausgeliehen."); } else { System.out.println("Das Medium ist bereits ausgeliehen."); } } else { System.out.println("Medium mit dieser ID nicht gefunden."); } } // Rückgabe eines Mediums private void rueckgabeDurchfuehren() { Benutzer benutzer = anmelden(); if (benutzer == null) { System.out.println("Sie müssen sich zuerst anmelden."); return; } System.out.print("Geben Sie die ID des Mediums ein, das Sie zurückgeben möchten: "); int id = scanner.nextInt(); scanner.nextLine(); // Puffer leeren Optional optionalMedien = verwaltung.mediensListe.stream() .filter(medien -> medien.getId() == id) .findFirst(); if (optionalMedien.isPresent()) { Medien medien = optionalMedien.get(); // Benutzer nach einem Rückgabedatum fragen System.out.println("Aktuelles Rückgabedatum: " + LocalDate.now()); System.out.print("Möchten Sie das Rückgabedatum ändern? (ja/nein): "); String antwort = scanner.nextLine(); LocalDate rueckgabedatum; if (antwort.equalsIgnoreCase("ja")) { // Benutzer nach einem neuen Rückgabedatum fragen System.out.print("Geben Sie das Rückgabedatum im Format JJJJ-MM-TT ein: "); String datumInput = scanner.nextLine(); // Versuch, das Datum zu parsen try { rueckgabedatum = LocalDate.parse(datumInput); System.out.println("Das Rückgabedatum wurde auf " + rueckgabedatum + " gesetzt."); } catch (Exception e) { System.out.println("Ungültiges Datum. Rückgabe wird mit dem heutigen Datum durchgeführt."); rueckgabedatum = LocalDate.now(); // Standard auf das heutige Datum } } else { // Standardmäßig wird das heutige Datum verwendet rueckgabedatum = LocalDate.now(); } // Rückgabe durchführen verwaltung.rueckgabe(id, benutzer, rueckgabedatum); System.out.println("Das Medium wurde erfolgreich zurückgegeben."); } else { System.out.println("Medium mit dieser ID nicht gefunden."); } } private void gebuehrenEinsehen() { Benutzer benutzer = anmelden(); if (benutzer == null) { System.out.println("Sie müssen sich zuerst anmelden."); return; } System.out.println("Ihre ausstehenden Gebühren:"); // Liste der ausgeliehenen Medien des Benutzers List ausleihen = verwaltung.getAusleihenByBenutzer(benutzer); if (ausleihen.isEmpty()) { System.out.println("Sie haben keine ausgeliehenen Medien."); return; } // Aktuelles Datum LocalDate heute = LocalDate.now(); // Durchlaufe alle ausgeliehenen Medien und berechne mögliche Gebühren for (Aausleihe ausleihe : ausleihen) { Medien medien = ausleihe.getMedien(); LocalDate faelligkeitsdatum = ausleihe.getDate().plusWeeks(medien.frist); // Annahme: `frist` gibt die Leihfrist in Wochen an double gebuehr = 0; if (heute.isAfter(faelligkeitsdatum)) { long ueberfaelligeWochen = ChronoUnit.WEEKS.between(faelligkeitsdatum, heute); gebuehr = ueberfaelligeWochen * 2.0; // Beispiel: 2 EUR pro überfälliger Woche } // Gebühr und Fälligkeitsdatum ausgeben System.out.println("Medium: " + medien.getName() + ", Fälligkeitsdatum: " + faelligkeitsdatum + ", Überfällige Wochen: " + (heute.isAfter(faelligkeitsdatum) ? ChronoUnit.WEEKS.between(faelligkeitsdatum, heute) : 0) + ", Gebühr: " + gebuehr + " EUR"); } } private void verlaengern() { Benutzer benutzer = anmelden(); if (benutzer == null) { System.out.println("Sie müssen sich zuerst anmelden."); return; } System.out.print("Geben Sie die ID des Mediums ein, das Sie verlängern möchten: "); int id = scanner.nextInt(); scanner.nextLine(); // Puffer leeren Optional optionalMedien = verwaltung.mediensListe.stream() .filter(medien -> medien.getId() == id) .findFirst(); if (optionalMedien.isPresent()) { verwaltung.verlängern(optionalMedien.get(), benutzer); System.out.println("Das Medium wurde verlängert."); } else { System.out.println("Medium mit dieser ID nicht gefunden."); } } private void adminrechte() { System.out.print("Geben Sie den Admin-Benutzernamen ein: "); String benutzername = scanner.nextLine(); System.out.print("Geben Sie das Admin-Passwort ein: "); String passwort = scanner.nextLine(); if (benutzername.equals("admin") && passwort.equals("admin123")) { System.out.println("Admin-Login erfolgreich."); verbucheUeberfaelligeGebuehren(); } else { System.out.println("Falsche Admin-Zugangsdaten."); } } private void verbucheUeberfaelligeGebuehren() { System.out.println("Verbuchen überfälliger Gebühren:"); LocalDate heute = LocalDate.now(); for (Aausleihe ausleihe : verwaltung.ausliste) { Medien medien = ausleihe.getMedien(); Benutzer benutzer = ausleihe.getBenutzer(); LocalDate faelligkeitsdatum = ausleihe.getDate().plusWeeks(medien.frist); if (heute.isAfter(faelligkeitsdatum)) { long ueberfaelligeWochen = ChronoUnit.WEEKS.between(faelligkeitsdatum, heute); double gebuehr = ueberfaelligeWochen * 2.0; // Beispiel: 2 EUR pro Woche überfällig System.out.println("Benutzer: " + benutzer.getName() + ", Medium: " + medien.getName() + ", Überfällige Wochen: " + ueberfaelligeWochen + ", Gebühr: " + gebuehr + " EUR"); } } } }