package projetMusee.ui;

import projetMusee.backend.Museum;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.text.Normalizer;
import java.util.List;

/**
 * Génère un rapport HTML avec la liste des musées et les champs sélectionnés.
 */
public class HTMLReportGenerator {

    /**
     * Génère un fichier HTML complet et l'enregistre sur le disque.
     *
     * @param musees Liste des musées filtrés
     * @param champs Liste des champs sélectionnés
     * @return Chemin absolu du fichier HTML généré
     */
    public static String generateHTMLReport(List<Museum> musees, List<String> champs) {
        StringBuilder html = new StringBuilder();

        // Début du document HTML
        html.append("<html><head><meta charset='UTF-8'><style>");
        html.append("body { font-family: Arial, sans-serif; margin: 40px; background-color: #f4f4f4; }");
        html.append("h2 { color: #333; }");
        html.append("table { border-collapse: collapse; width: 100%; background-color: white; }");
        html.append("th, td { border: 1px solid #ccc; padding: 10px; text-align: left; }");
        html.append("th { background-color: #e6e6e6; }");
        html.append("</style></head><body>");

        html.append("<h1>Rapport de musées</h1>");
        html.append("<img src='output.svg' alt='Diagramme'>");
        html.append("<p>Ce rapport contient la liste des musées filtrés selon les critères sélectionnés.</p>");

        // Titre du rapport
        html.append("<h2>Liste des musées filtrés</h2>");
        html.append("<table><tr><th>#</th><th>Nom</th>");

        // Création des colonnes du tableau en fonction des champs sélectionnés
        for (String champ : champs) {
            html.append("<th>").append(champ).append("</th>");
        }
        html.append("</tr>");

        // Remplir le tableau avec les données des musées
        int index = 1;
        for (Museum musee : musees) {
            html.append("<tr>");
            html.append("<td>").append(index++).append("</td>");
            html.append("<td>").append(unescapeUnicode(musee.getOfficialName())).append("</td>");
            for (String champ : champs) {
                html.append("<td>").append(unescapeUnicode(getValeurChamp(musee, champ))).append("</td>");
            }
            html.append("</tr>");
        }

        // Fermeture du tableau et du document HTML
        html.append("</table>");

        // === Bouton Télécharger en PDF ===
        html.append("<br><button onclick=\"window.print()\" ");
        html.append(
                "style='padding: 10px 20px; font-size: 16px; background-color: #4CAF50; color: white; border: none; border-radius: 4px; cursor: pointer;'>");
        html.append("Télécharger en PDF</button>");

        html.append("</body></html>");

        // Enregistrement du fichier HTML avec UTF-8
        try (FileOutputStream fos = new FileOutputStream("rapport.html");
                OutputStreamWriter writer = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
            writer.write(html.toString());
            System.out.println("Fichier généré : " + new File("rapport.html").getAbsolutePath());
            return new File("rapport.html").getAbsolutePath();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * Supprime les accents et standardise une chaîne (utile pour du filtrage, pas
     * pour affichage HTML)
     */
    public static String encode(String input) {
        if (input == null)
            return "";
        return Normalizer.normalize(input, Normalizer.Form.NFD)
                .replaceAll("\\p{M}", "") // Supprime les accents
                .toLowerCase()
                .trim();
    }

    /**
     * Décode une chaîne contenant des séquences Unicode (ex: \u00e9 -> é).
     */
    public static String unescapeUnicode(String input) {
        if (input == null)
            return "";
        StringBuilder result = new StringBuilder();
        int i = 0;
        while (i < input.length()) {
            char c = input.charAt(i++);
            if (c == '\\' && i < input.length() && input.charAt(i) == 'u') {
                i++;
                try {
                    int code = Integer.parseInt(input.substring(i, i + 4), 16);
                    result.append((char) code);
                    i += 4;
                } catch (Exception e) {
                    result.append("\\u");
                }
            } else {
                result.append(c);
            }
        }
        return result.toString();
    }

    /**
     * Retourne la valeur du champ pour un musée donné.
     */
    private static String getValeurChamp(Museum musee, String champ) {
        switch (champ) {
            case "URL":
                return musee.getUrl();
            case "Adresse":
                return musee.getAddress();
            case "Région":
                return musee.getRegion();
            case "Année de création":
                return String.valueOf(musee.getCreationYear());
            case "Catégorie":
                return musee.getCategory();
            default:
                return "-";
        }
    }
}
