package projetMusee.visustats;

import projetMusee.backend.Museum;
import projetMusee.backend.enums.TypeStatistique;

import java.io.*;
import java.util.*;

import fr.univrennes.istic.l2gen.visustats.Visustat;

/**
 * Classe permettant de générer des fichiers CSV et de créer des diagrammes avec Visustat.
 */
public class VisustatEngine {

    private static final String CSV_DIRECTORY = "data/"; // Dossier où enregistrer les fichiers CSV
    private static final String OUTPUT_FILE = "output.svg"; // Fichier SVG de sortie

    /**
     * Génère un fichier CSV contenant des statistiques sur les musées.
     *
     * @param filteredMuseums La liste des musées après filtrage.
     * @param typeStatistique Le type de statistiques à générer.
     * @return Le chemin du fichier CSV généré.
     * @throws IOException si une erreur survient lors de l'écriture du fichier.
     */
    public String generateCSV(List<Museum> filteredMuseums, TypeStatistique typeStatistique) throws IOException {
        // Vérifie si le dossier data existe, sinon le crée
        File directory = new File(CSV_DIRECTORY);
        if (!directory.exists()) {
            directory.mkdir();
        }

        // Création du fichier CSV
        String csvFileName = CSV_DIRECTORY + "output.csv";
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(csvFileName))) {
            // Génère le CSV selon le type de statistiques demandées
            switch (typeStatistique) {
                case PAR_REGION:
                    generateMuseeParRegionCSV(writer, filteredMuseums);
                    break;
                case PAR_DEPARTEMENT:
                    generateMuseeParDepartementCSV(writer, filteredMuseums);
                    break;
                case PAR_VILLE:
                    generateMuseeParVilleCSV(writer, filteredMuseums);
                    break;
                case PAR_THEME:
                    generateMuseeParThemeCSV(writer, filteredMuseums);
                    break;
            }
        }
        return csvFileName;
    }

    /**
     * Génère un fichier CSV basé sur le nombre de musées par région.
     */
    private void generateMuseeParRegionCSV(BufferedWriter writer, List<Museum> museums) throws IOException {
        Map<String, Integer> regionCount = new HashMap<>();
        for (Museum museum : museums) {
            String region = museum.getRegion();
            regionCount.put(region, regionCount.getOrDefault(region, 0) + 1);
        }
        
        List<String> regions = new ArrayList<>(regionCount.keySet());
        Collections.sort(regions); 
  
        writer.write("Nombre de musées par région");
        for (String region : regions) {
            writer.write("," + region);
        }
        writer.write("\n");
        
        writer.write("Nombre de musées");
        for (String region : regions) {
            writer.write("," + regionCount.get(region));
        }
    }

    /**
     * Génère un fichier CSV basé sur le nombre de musées par département.
     */
    private void generateMuseeParDepartementCSV(BufferedWriter writer, List<Museum> museums) throws IOException {
        Map<String, Integer> departementCount = new HashMap<>();
        for (Museum museum : museums) {
            String dept = museum.getDepartment();
            departementCount.put(dept, departementCount.getOrDefault(dept, 0) + 1);
        }
        
        List<String> departements = new ArrayList<>(departementCount.keySet());
        Collections.sort(departements);
        
        writer.write("Nombre de musées par département");
        for (String dept : departements) {
            writer.write("," + dept);
        }
        writer.write("\n");
        
        writer.write("Nombre de musées");
        for (String dept : departements) {
            writer.write("," + departementCount.get(dept));
        }
    }

    /**
     * Génère un fichier CSV basé sur le nombre de musées par ville.
     */
    private void generateMuseeParVilleCSV(BufferedWriter writer, List<Museum> museums) throws IOException {
        Map<String, Integer> villeCount = new HashMap<>();
        for (Museum museum : museums) {
            String ville = museum.getCity();
            villeCount.put(ville, villeCount.getOrDefault(ville, 0) + 1);
        }
        
        List<String> villes = new ArrayList<>(villeCount.keySet());
        Collections.sort(villes);
        
        writer.write("Nombre de musées par ville");
        for (String ville : villes) {
            writer.write("," + ville);
        }
        writer.write("\n");
        
        writer.write("Nombre de musées");
        for (String ville : villes) {
            writer.write("," + villeCount.get(ville));
        }
    }

    /**
     * Génère un fichier CSV basé sur le nombre de musées par thématique.
     */
    private void generateMuseeParThemeCSV(BufferedWriter writer, List<Museum> museums) throws IOException {
        Map<String, Integer> themeCount = new HashMap<>();
        for (Museum museum : museums) {
            for (String theme : museum.getThematicDomain()) {
                themeCount.put(theme, themeCount.getOrDefault(theme, 0) + 1);
            }
        }
        
        List<String> themes = new ArrayList<>(themeCount.keySet());
        Collections.sort(themes);
        
        writer.write("Répartition des musées par thématique");
        for (String theme : themes) {
            writer.write("," + theme);
        }
        writer.write("\n");
        
        writer.write("Nombre de musées");
        for (String theme : themes) {
            writer.write("," + themeCount.get(theme));
        }
    }

    /**
     * Génère un diagramme à partir du fichier CSV créé en utilisant VisustatTest.
     *
     * @param csvFilePath Le chemin du fichier CSV contenant les données du diagramme.
     * @param diagrammeType Le type de diagramme à générer.
     * @return Le chemin du fichier SVG généré (toujours "output.svg").
     */
    public String genereDiagramme(String csvFilePath, String diagrammeType,  String[] colors) {
        // Chargement dynamique de la classe Visustat depuis le .jar
        Visustat visustat = new Visustat(csvFilePath, diagrammeType, colors);
        visustat.generateDiagramme();
        return OUTPUT_FILE;
    }
}