import java.time.LocalDate; import java.time.temporal.ChronoUnit; import java.util.*; public class Ui { private final Scanner scanner = new Scanner(System.in); private final Verwaltung verwaltung; // Zeitversatz für Tests private LocalDate aktuelleZeit = LocalDate.now(); 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("9: Zeit verschieben (Testoption)"); System.out.println("0: Programm beenden"); int menue = scanner.nextInt(); scanner.nextLine(); // Leert den Puffer nach nextInt() switch (menue) { case 1 -> suchenNachMedien(); case 2 -> ausleihen(); case 3 -> rueckgabeDurchfuehren(); case 4 -> gebuehrenEinsehen(); case 5 -> verlaengern(); case 6 -> adminrechte(); case 7 -> registrieren(); case 8 -> anmelden(); case 9 -> zeitVerschieben(); 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) { 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); System.out.println(" ist ausgeliehen. Rückgabedatum: " + rueckgabedatum); } } else { System.out.println(" ist verfügbar."); } } } } 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(); int genkundennummer = verwaltung.generiereEindeutigeKundennummer(); Benutzer neuerBenutzer = Creator.factoryBenutzer(name, nachname, genkundennummer, artInput.toLowerCase()); if (neuerBenutzer != null) { verwaltung.benutzerListe.add(neuerBenutzer); System.out.println("Registrierung erfolgreich! Ihre Kundennummer lautet: " + genkundennummer); } else { System.out.println("Ungültige Art. Versuchen Sie es erneut."); } } 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; } } 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()) { verwaltung.addAL(medien, benutzer, aktuelleZeit, 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."); } } 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()) { verwaltung.rueckgabe(id, benutzer, aktuelleZeit); System.out.println("Das Medium wurde erfolgreich zurückgegeben."); } else { System.out.println("Medium mit dieser ID nicht gefunden."); } } 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."); } System.out.println("möchten sie zahlungen löschem geben sie benutzer id ein"); int id=scanner.nextInt(); } private void verbucheUeberfaelligeGebuehren() { System.out.println("Verbuchen überfälliger Gebühren:"); for (Aausleihe ausleihe : verwaltung.ausliste) { Medien medien = ausleihe.getMedien(); Benutzer benutzer = ausleihe.getBenutzer(); LocalDate faelligkeitsdatum = ausleihe.getDate().plusDays(medien.frist); if (aktuelleZeit.isAfter(faelligkeitsdatum)) { long ueberfaelligeWochen = ChronoUnit.DAYS.between(faelligkeitsdatum, aktuelleZeit); double gebuehr = ueberfaelligeWochen; System.out.println("Benutzer: " + benutzer.getName() + ", Medium: " + medien.getName() + ", Überfällige Wochen: " + ueberfaelligeWochen + ", Gebühr: " + gebuehr + " EUR"); } } } 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:"); List ausleihen = verwaltung.getAusleihenByBenutzer(benutzer); if (ausleihen.isEmpty()) { System.out.println("Sie haben keine ausgeliehenen Medien."); return; } boolean hatAusgelieheneMedien = false; for (Aausleihe ausleihe : ausleihen) { Medien medien = ausleihe.getMedien(); // Prüfen, ob das Medium ausgeliehen ist if (!medien.istAusgeliehen()) { continue; // Überspringt Medien, die nicht ausgeliehen sind } hatAusgelieheneMedien = true; // Mindestens ein Medium ist ausgeliehen LocalDate faelligkeitsdatum = ausleihe.getDate().plusWeeks(medien.frist); double gebuehr = 0; // Gebühren berechnen, wenn das Medium überfällig ist if (aktuelleZeit.isAfter(faelligkeitsdatum)) { long ueberfaelligeTage = ChronoUnit.DAYS.between(faelligkeitsdatum, aktuelleZeit); gebuehr = ueberfaelligeTage * 2.0; // 2 EUR pro überfälligem Tag } // Details zum Medium ausgeben System.out.println("Medium: " + medien.getName() + ", Fälligkeitsdatum: " + faelligkeitsdatum + ", Gebühr: " + gebuehr + " EUR"); } if (!hatAusgelieheneMedien) { System.out.println("Sie haben keine ausgeliehenen Medien."); } } private void zeitVerschieben() { System.out.println("Aktuelles Datum: " + aktuelleZeit); System.out.print("Geben Sie das neue Datum im Format JJJJ-MM-TT ein: "); String neuesDatum = scanner.nextLine(); try { aktuelleZeit = LocalDate.parse(neuesDatum); System.out.println("Die Zeit wurde erfolgreich auf " + aktuelleZeit + " geändert."); } catch (Exception e) { System.out.println("Ungültiges Datum. Bitte versuchen Sie es erneut."); } } }