package projetMusee.ui;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import projetMusee.backend.Museum;
import projetMusee.util.BufferedImageTranscoder;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ReportPreviewPanel extends JPanel {
    private final Image background = new ImageIcon("data/musee.jpg").getImage();
    private JButton previousBtn, downloadBtn;
    private List<String> selectedFields;
    private List<Museum> filteredMuseums;
    private PreviewPanel previewPanel;
    private JTable table;

    public ReportPreviewPanel(List<String> selectedFields,
            List<Museum> filteredMuseums,
            PreviewPanel previewPanel) {
        this.selectedFields = selectedFields;
        this.filteredMuseums = filteredMuseums;
        this.previewPanel = previewPanel;

        initUI();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(background, 0, 0, getWidth(), getHeight(), this);
    }

    private void initUI() {
        setLayout(new BorderLayout(15, 15));
        setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        setOpaque(false);

        JPanel reportPanel = createNorthPanel();
        add(reportPanel, BorderLayout.NORTH);

        JPanel tablePanel = createCenterTablePanel();
        add(tablePanel, BorderLayout.CENTER);

        JPanel btnPanel = createSouthPanel();
        add(btnPanel, BorderLayout.SOUTH);
    }

    private JPanel createNorthPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setOpaque(true);
        panel.setBackground(new Color(255, 255, 255, 220));
        panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

        try {
            String svgURI = new File("output.svg").toURI().toString();
            BufferedImage img = BufferedImageTranscoder.transcode(svgURI, 600, 400);
            JLabel svgLabel = new JLabel(new ImageIcon(img));
            svgLabel.setHorizontalAlignment(SwingConstants.CENTER);
            svgLabel.setOpaque(false);
            panel.add(svgLabel, BorderLayout.CENTER);
        } catch (Exception e) {
            JLabel error = new JLabel("Erreur affichage SVG");
            error.setForeground(Color.RED);
            panel.add(error, BorderLayout.CENTER);
            e.printStackTrace();
        }

        return panel;
    }

    private JPanel createCenterTablePanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setOpaque(true);
        panel.setBackground(new Color(255, 255, 255, 220));
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

        DefaultTableModel tableModel = new DefaultTableModel();

 
    // On défini les colonnes une seule fois
    tableModel.addColumn("Nom du musée");
    for (String field : selectedFields) {
        tableModel.addColumn(field);
    }

    // Remplissage des lignes
    for (Museum museum : filteredMuseums) {
        List<Object> rowData = new ArrayList<>();

        // Nom du musée toujours présent
        rowData.add(museum.getOfficialName());

        for (String field : selectedFields) {
            switch (field) {
                case "URL":
                    rowData.add(museum.getUrl());
                    break;
                case "Adresse":
                    rowData.add(museum.getAddress());
                    break;
                case "Région":
                    rowData.add(museum.getRegion());
                    break;
                case "Catégorie":
                    rowData.add(museum.getCategory());
                    break;
                case "Année de création":
                    rowData.add(museum.getCreationYear());
                    break;
                default:
                    rowData.add("—");
            }
        }
        tableModel.addRow(rowData.toArray());
    }

        table = new JTable(tableModel);
        table.setFillsViewportHeight(true);
        table.setRowHeight(30);
        table.setFont(new Font("Roboto", Font.PLAIN, 14));
        table.getTableHeader().setFont(new Font("Roboto", Font.BOLD, 14));

        JScrollPane scrollPane = new JScrollPane(table);
        panel.add(scrollPane, BorderLayout.CENTER);

        return panel;
    }

    private JPanel createSouthPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setOpaque(false);

        // Bouton "Précédent"
        previousBtn = new JButton("Précédent") {
            @Override
            protected void paintComponent(Graphics g) {
                g.setColor(getModel().isRollover() ? new Color(70, 130, 180) : new Color(70, 130, 150));
                g.fillRoundRect(0, 0, getWidth(), getHeight(), 15, 15);
                super.paintComponent(g);
            }
        };
        previousBtn.setPreferredSize(new Dimension(150, 50));
        previousBtn.setFont(new Font("Roboto", Font.BOLD, 16));
        previousBtn.setForeground(Color.WHITE);
        previousBtn.setContentAreaFilled(false);
        previousBtn.setBorder(BorderFactory.createEmptyBorder());
        previousBtn.addActionListener(e -> {
            JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
            topFrame.setContentPane(previewPanel); // Réaffiche simplement l'ancien PreviewPanel
            topFrame.revalidate();
            topFrame.repaint();
        });

        // Bouton "Télécharger"
        downloadBtn = new JButton("Télécharger") {
            @Override
            protected void paintComponent(Graphics g) {
                if (getModel().isRollover()) {
                    g.setColor(new Color(34, 139, 34));
                } else {
                    g.setColor(new Color(34, 139, 50));
                }
                g.fillRoundRect(0, 0, getWidth(), getHeight(), 15, 15);
                super.paintComponent(g);
            }
        };
        downloadBtn.setPreferredSize(new Dimension(300, 50));
        downloadBtn.setFont(new Font("Roboto", Font.BOLD, 16));
        downloadBtn.setForeground(Color.WHITE);
        downloadBtn.setContentAreaFilled(false);
        downloadBtn.setBorder(BorderFactory.createEmptyBorder());
        downloadBtn.addActionListener(e -> generateAndOpenHTMLReport());

        panel.add(previousBtn, BorderLayout.WEST);
        panel.add(downloadBtn, BorderLayout.EAST);

        return panel;
    }

   // Méthode pour générer et ouvrir le rapport HTML dans le navigateur
private void generateAndOpenHTMLReport() {
    // Appeler la méthode generateHTMLReport pour générer le rapport HTML
    String reportFilePath = HTMLReportGenerator.generateHTMLReport(filteredMuseums, selectedFields);

    if (reportFilePath != null) {
        try {
            // Créer un objet File à partir du chemin du rapport généré
            File reportFile = new File(reportFilePath);

            // Vérifier si le fichier existe avant de tenter de l'ouvrir
            if (reportFile.exists() && reportFile.isFile()) {
                // Ouvrir le fichier HTML dans le navigateur par défaut
                Desktop.getDesktop().browse(reportFile.toURI()); // Ouvre le fichier dans le navigateur
            } else {
                // Si le fichier n'existe pas, afficher un message d'erreur
                JOptionPane.showMessageDialog(this, "Le fichier n'a pas pu être trouvé.", "Erreur", JOptionPane.ERROR_MESSAGE);
            }
        } catch (IOException e) {
            // Si une erreur survient lors de l'ouverture du fichier, afficher une erreur
            JOptionPane.showMessageDialog(this, "Erreur lors de l'ouverture du rapport.", "Erreur", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
        }
    }
}

}
