import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; public class Statistiques { private int nbVehicules; private int nbDispo; private int nbLocations; private double revenuTotal; private double tauxOccupation; private Vehicule vehiculePopulaire; private Client clientFidele; public Statistiques() {} public void calculer(List inventaire, List historique) { if (inventaire == null || historique == null) return; // 1. Volumes de base this.nbVehicules = inventaire.size(); this.nbLocations = historique.size(); // 2. Disponibilité et Taux d'occupation this.nbDispo = (int) inventaire.stream() .filter(Vehicule::isDisponible) .count(); if (this.nbVehicules > 0) { // Le taux d'occupation se base sur les véhicules actuellement non disponibles this.tauxOccupation = ((double) (nbVehicules - nbDispo) / nbVehicules) * 100; } // 3. Revenu Total (uniquement sur les locations validées/terminées) this.revenuTotal = historique.stream() .filter(loc -> loc.getStatut() != StatutLocation.ANNULEE) .mapToDouble(Location::getPrixTotal) .sum(); // 4. Recherche du Véhicule Populaire (celui qui apparaît le plus dans l'historique) if (!historique.isEmpty()) { this.vehiculePopulaire = historique.stream() .map(Location::getVoiture) // On extrait le véhicule de chaque location .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .entrySet().stream() .max(Map.Entry.comparingByValue()) .map(Map.Entry::getKey) .orElse(null); // 5. Recherche du Client Fidèle (celui qui a fait le plus de locations) this.clientFidele = historique.stream() .map(Location::getClient) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .entrySet().stream() .max(Map.Entry.comparingByValue()) .map(Map.Entry::getKey) .orElse(null); } } public void afficher() { System.out.println("\n========================================"); System.out.println(" TABLEAU DE BORD STATISTIQUE "); System.out.println("========================================"); System.out.printf(" Fleet : %d véhicules (%d dispos)\n", nbVehicules, nbDispo); System.out.printf(" Activité : %d locations effectuées\n", nbLocations); System.out.printf(" Taux d'occupation : %.1f%%\n", tauxOccupation); System.out.printf(" Revenu Total : %.2f €\n", revenuTotal); System.out.println("----------------------------------------"); if (vehiculePopulaire != null) { System.out.println(" Véhicule le plus loué : " + vehiculePopulaire.getMarque() + " " + vehiculePopulaire.getModele()); } if (clientFidele != null) { System.out.println(" Client le plus fidèle : " + clientFidele.getNom() + " " + clientFidele.getPrenom()); } System.out.println("========================================\n"); } }