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<Vehicule> ListeVehicule;
ArrayList<Client> ListeClients;
ArrayList<Location> 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<Vehicule> GetVehiculesDisponible() {
return ListeVehicule.stream()
.filter(Vehicule::isDisponible)
.collect(Collectors.toList());
}
// Recherche par marque
public List<Vehicule> 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<Vehicule> getListeVehicule() { return ListeVehicule; }
public ArrayList<Location> 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<Vehicule> trierVehicules(String critere) {
ArrayList<Vehicule> 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<Client> trierClients() {
ArrayList<Client> 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<Vehicule> rechercheMulticritere(String marque, Double prixMax, Boolean disponible) {
ArrayList<Vehicule> 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<Location> getLocationsClient(int cId) {
ArrayList<Location> 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;
}
}