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