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<Vehicule> inventaire, List<Location> 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");
}
}