package projetMusee.ui;

// Importation des classes nécessaires
import projetMusee.backend.Museum;
import projetMusee.backend.enums.CritereFiltrage;
import projetMusee.backend.enums.TypeDiagramme;
import projetMusee.backend.enums.TypeStatistique;
import projetMusee.facade.ApplicationFacade;


import projetMusee.util.BufferedImageTranscoder;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.List;
import java.util.Map;

// Classe PreviewPanel qui hérite de JPanel
public class PreviewPanel extends JPanel {

    // Déclaration des attributs principaux
    private final ApplicationFacade facade;
    private final List<Museum> filteredMuseums;
    private final TypeDiagramme diagramType;
    private final TypeStatistique typestats;
    private final Map<CritereFiltrage, List<String>> selectedCriteria;
    private final Image background = new ImageIcon("data/musee.jpg").getImage(); // Image de fond
    private JButton previewBtn, previousBtn;
    //private JLabel diagramLabel; // Label où sera affiché le diagramme
    private SelectionPanel selectionPanel;
    private ReportSelectionPanel reportSelection;
    
    // Constructeur
    public PreviewPanel(List<Museum> filteredMuseums, 
                        TypeDiagramme diagramType, 
                        TypeStatistique typestats, 
                        Map<CritereFiltrage, List<String>> selectedCriteria,
                        SelectionPanel selectionPanel) {
        this.facade = new ApplicationFacade(); // Création d'une nouvelle façade
        this.filteredMuseums = filteredMuseums;
        this.diagramType = diagramType;
        this.typestats = typestats;
        this.selectedCriteria = selectedCriteria;
        this.selectionPanel = selectionPanel ;
        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);

        // Zone du haut : Affichage du diagramme
        JPanel diagramPanel = createNorthPanel();
        add(diagramPanel, BorderLayout.NORTH);

        // Zone centrale : Checkbox choix de critères
        reportSelection = new ReportSelectionPanel(filteredMuseums);
        reportSelection.setOpaque(false);
        add(reportSelection, BorderLayout.CENTER);

        // Zone du bas : Boutons "Précédent" et "Voir dans le navigateur"
        JPanel buttonPanel = createSouthPanel();
        add(buttonPanel, 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));

        // 1) Titre
        JLabel title = new JLabel("Aperçu du diagramme", SwingConstants.CENTER);
        title.setFont(new Font("Roboto", Font.BOLD, 16));
        panel.add(title, BorderLayout.NORTH);

        // 2) Conversion SVG → BufferedImage
        try {
            String svgURI = new File("output.svg")
                                .toURI()
                                .toString();
            // largeur=600, hauteur=400 → adapte selon tes besoins
            BufferedImage img = BufferedImageTranscoder.transcode(svgURI, 600, 400);
            // 3) Création de l’icone et du label
            ImageIcon icon = new ImageIcon(img);
            JLabel svgLabel = new JLabel(icon);
            svgLabel.setHorizontalAlignment(SwingConstants.CENTER);
            svgLabel.setOpaque(false);

            // On ajoute sous le titre
            panel.add(svgLabel, BorderLayout.CENTER);
        } catch (Exception e) {
            // En cas d’erreur de transcoding, on affiche un message
            JLabel error = new JLabel("Erreur affichage SVG");
            error.setForeground(Color.RED);
            panel.add(error, BorderLayout.CENTER);
            e.printStackTrace();
        }

        return panel;
    }

    private JPanel createCenterPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setOpaque(true);
        panel.setBackground(new Color(255, 255, 255, 220));
        panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

        JLabel title = new JLabel("Critères de sélection :");
        title.setFont(new Font("Roboto", Font.BOLD, 16));
        title.setAlignmentX(Component.LEFT_ALIGNMENT);
        panel.add(title);
        panel.add(Box.createVerticalStrut(10));
    
        for (Map.Entry<CritereFiltrage, List<String>> entry : selectedCriteria.entrySet()) {
            // Titre du critère
            JLabel titleLabel = new JLabel(entry.getKey().toString());
            titleLabel.setFont(new Font("Roboto", Font.BOLD, 16));
            titleLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
            panel.add(titleLabel);

            // Liste des valeurs sélectionnées
            for (String value : entry.getValue()) {
                JLabel valueLabel = new JLabel("- " + value);
                valueLabel.setFont(new Font("Roboto", Font.PLAIN, 14));
                valueLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
                panel.add(valueLabel);
            }

            panel.add(Box.createVerticalStrut(10)); // Espace entre les groupes
        }

        return panel;
    }

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

        // Bouton "Précédent"
        previousBtn = new JButton("Précédent") {
            @Override
            protected void paintComponent(Graphics g) {
                if (getModel().isRollover()) {
                    g.setColor(new Color(70, 130, 180));
                } else {
                    g.setColor(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(selectionPanel); // Réaffiche simplement l'ancien SelectionPanel
            topFrame.revalidate();
            topFrame.repaint();
        });
        
        // Bouton "Voir dans le navigateur"
        previewBtn = new JButton("Previsualiser") {
            @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);
            }
        };
        previewBtn.setPreferredSize(new Dimension(300, 50));
        previewBtn.setFont(new Font("Roboto", Font.BOLD, 16));
        previewBtn.setForeground(Color.WHITE);
        previewBtn.setContentAreaFilled(false);
        previewBtn.setBorder(BorderFactory.createEmptyBorder());
        previewBtn.addActionListener(e -> {
            
            // Crée directement le panneau de prévisualisation avec les musées filtrés
            List<String> selectedFields = reportSelection.getSelectedReportFields();
            ReportPreviewPanel reportPreview = new ReportPreviewPanel(selectedFields, filteredMuseums, this);
        
            // Remplace le contenu de la fenêtre par ce panneau
            JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
            topFrame.setContentPane(reportPreview);
            topFrame.revalidate();
            topFrame.repaint();
        });

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

        return panel;
    }

}
