Projet-location / src / AgenceLocation.java
AgenceLocation.java
Raw
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;
    }
}