import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.time.LocalDate; import java.util.stream.Collectors; public class AgenceLocation { ArrayList ListeVehicule; ArrayList ListeClients; ArrayList ListeLocation; public AgenceLocation() { this.ListeVehicule = new ArrayList<>(); this.ListeClients = new ArrayList<>(); this.ListeLocation = new ArrayList<>(); } public void AjouterVehicule(Vehicule v) { ListeVehicule.add(v); } public Vehicule RechercherVehicule(int id) { for (Vehicule v : ListeVehicule) { if (v.getId() == id) return v; } return null; } // Filtrer les véhicules disponibles public List GetVehiculesDisponible() { return ListeVehicule.stream() .filter(Vehicule::isDisponible) .collect(Collectors.toList()); } // Recherche par marque public List RechercheParMarque(String m) { return ListeVehicule.stream() .filter(v -> v.getMarque().equalsIgnoreCase(m)) .collect(Collectors.toList()); } public void SupprimerVehicule(Vehicule v) { this.ListeVehicule.remove(v); } public void ajouterClient(Client c) { this.ListeClients.add(c); } public void SuprimerClient(int id) { // On utilise removeIf pour supprimer le client qui correspond à l'ID this.ListeClients.removeIf(c -> c.getId() == id); } public Client RechercherClient(int id) { for (Client c : ListeClients) { if (c.getId() == id) return c; } return null; } public Location louerVehicule(int idVehicule, Client idClient, LocalDate d1, LocalDate d2) { Vehicule v = RechercherVehicule(idVehicule); // On vérifie si le véhicule existe et est libre if (v != null && v.isDisponible()) { // On crée l'objet Location (en supposant que tu as le constructeur adapté) Location nouvelleLoc = new Location(v, idClient, d1, d2); // Note : voiture.louer() est déjà appelé dans le constructeur de Location ListeLocation.add(nouvelleLoc); return nouvelleLoc; } return null; // Location impossible } public ArrayList getListeVehicule() { return ListeVehicule; } public ArrayList getListeLocation() { return ListeLocation; } // ════════════════════════════════════════════════════ // Méthodes 11-19 // ════════════════════════════════════════════════════ // 11. Retourner un véhicule (terminer la location) public void retournerVehicule(int locId) { for (Location loc : ListeLocation) { if (loc.getId() == locId) { loc.terminerLocation(); System.out.println("✔ Location #" + locId + " terminée. Statut : " + loc.getStatut()); return; } } System.out.println("⚠ Aucune location trouvée avec l'ID " + locId); } // 12. Afficher toutes les locations en cours public void afficherLocationsEnCours() { boolean found = false; System.out.println("\n── Locations en cours ──"); for (Location loc : ListeLocation) { if (loc.getStatut() == StatutLocation.EN_COURS || loc.getStatut() == StatutLocation.EN_RETARD) { loc.afficherLocation(); found = true; } } if (!found) System.out.println("Aucune location en cours."); } // 13. Trier les véhicules selon un critère ("prix", "marque", "annee") public List trierVehicules(String critere) { ArrayList trie = new ArrayList<>(ListeVehicule); switch (critere.toLowerCase()) { case "prix" -> trie.sort(Comparator.comparingDouble(Vehicule::getPrixJour)); case "marque" -> trie.sort(Comparator.comparing(Vehicule::getMarque)); case "annee" -> trie.sort(Comparator.comparingInt(Vehicule::getAnnee)); default -> System.out.println("⚠ Critère inconnu. Utilisez : prix, marque, annee"); } return trie; } // 14. Trier les clients par nom alphabétique public List trierClients() { ArrayList trie = new ArrayList<>(ListeClients); trie.sort(Comparator.comparing(Client::getNom)); return trie; } // 15. Recherche multicritère sur les véhicules // Passer null pour ignorer un critère public List rechercheMulticritere(String marque, Double prixMax, Boolean disponible) { ArrayList resultat = new ArrayList<>(); for (Vehicule v : ListeVehicule) { if (marque != null && !v.getMarque().equalsIgnoreCase(marque)) continue; if (prixMax != null && v.getPrixJour() > prixMax) continue; if (disponible != null && v.isDisponible() != disponible) continue; resultat.add(v); } return resultat; } // 16. Obtenir les statistiques de l'agence public Statistiques getStatistiques() { Statistiques stats = new Statistiques(); stats.calculer(ListeVehicule, ListeLocation); return stats; } // 17. Obtenir toutes les locations d'un client public List getLocationsClient(int cId) { ArrayList resultat = new ArrayList<>(); for (Location loc : ListeLocation) { if (loc.getClient().getId() == cId) { resultat.add(loc); } } return resultat; } // 18. Annuler une location (si elle est encore EN_COURS) public void annulerLocation(int locId) { for (Location loc : ListeLocation) { if (loc.getId() == locId) { if (loc.getStatut() == StatutLocation.EN_COURS) { loc.annulerLocation(); System.out.println("✔ Location #" + locId + " annulée."); } else { System.out.println("⚠ Impossible d'annuler : statut actuel = " + loc.getStatut()); } return; } } System.out.println("⚠ Aucune location trouvée avec l'ID " + locId); } // 19. Calculer le revenu total de toutes les locations terminées public double getRevenusTotal() { double total = 0; for (Location loc : ListeLocation) { if (loc.getStatut() == StatutLocation.TERMINEE || loc.getStatut() == StatutLocation.EN_RETARD) { total += loc.getPrixTotal(); } } return total; } }