package fr.iutfbleau.sae;

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

/**
 * Fenêtre principale du convertisseur.
 * Cette classe affiche l'image chargée, les tables de fréquences,
 * les codes Huffman et les codes canoniques. 
 * C'est la partie "Vue" de l'application.
 */
public class ConverterWindow extends JFrame {

    private ImagePreviewPanel imagePreviewPanel;
    private FrequencyTablePanel frequencyTablePanel;
    private CodeTablePanel codeTablePanel;

    /**
     * Constructeur de la fenêtre du convertisseur.
     * Initialise la fenêtre et installe tous les panneaux graphiques.
     */
    public ConverterWindow() {

        setTitle("Convertisseur PIF - Visualisation des données");
        setSize(900, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(true);
        setLayout(new BorderLayout());

        // Création des panneaux d'affichage
        imagePreviewPanel = new ImagePreviewPanel();
        frequencyTablePanel = new FrequencyTablePanel();
        codeTablePanel = new CodeTablePanel();

        // Panneau principal avec un scroll
        JPanel contentPanel = new JPanel(new BorderLayout());
        contentPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        JLabel header = new JLabel(" Convertisseur PIF – Visualisation des données ");
        header.setFont(new Font("SansSerif", Font.BOLD, 18));
        header.setHorizontalAlignment(SwingConstants.CENTER);

        contentPanel.add(header, BorderLayout.NORTH);
        contentPanel.add(imagePreviewPanel, BorderLayout.CENTER);

        // Les tables en bas
        JPanel tablesPanel = new JPanel();
        tablesPanel.setLayout(new BoxLayout(tablesPanel, BoxLayout.Y_AXIS));
        tablesPanel.add(frequencyTablePanel);
        tablesPanel.add(Box.createRigidArea(new Dimension(0, 5)));
        tablesPanel.add(codeTablePanel);

        contentPanel.add(tablesPanel, BorderLayout.SOUTH);

        JScrollPane scrollPane = new JScrollPane(contentPanel);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.getVerticalScrollBar().setUnitIncrement(16);

        add(scrollPane, BorderLayout.CENTER);

        // Fenêtre visible immédiatement
        setVisible(true);
    }

    /**
     * Affiche l'image chargée dans le panneau d'aperçu.
     * @param img l'image à afficher
     */
    public void setImagePreview(BufferedImage img) {
        imagePreviewPanel.setImage(img);
    }

    /**
     * Met à jour l'affichage des fréquences des trois composantes.
     */
    public void setFrequencyTable(int[] freqR, int[] freqG, int[] freqB) {
        frequencyTablePanel.updateFrequencies(freqR, freqG, freqB);
    }

    /**
     * Met à jour l'affichage des codes Huffman.
     */
    public void setHuffmanTable(Map<Integer, String> r,
                                Map<Integer, String> g,
                                Map<Integer, String> b) {
        codeTablePanel.updateCodes(r, g, b);
    }

    /**
     * Met à jour l'affichage des codes canoniques.
     */
    public void setCanonicalTable(Map<Integer, String> r,
                                  Map<Integer, String> g,
                                  Map<Integer, String> b) {
        codeTablePanel.updateCanonicalCodes(r, g, b);
    }

    /**
     * Ajoute un bouton permettant d'exporter l'image en .pif.
     * Le contrôleur est envoyé au listener responsable de la sauvegarde.
     */
    public void addSaveButton(ConverterController controller) {

        JButton saveBtn = new JButton("Exporter en .pif");
        ExportButtonListener listener = new ExportButtonListener(controller);
        saveBtn.addActionListener(listener);

        JPanel bottomPanel = new JPanel();
        bottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
        bottomPanel.add(saveBtn);

        add(bottomPanel, BorderLayout.SOUTH);

        revalidate();
        repaint();
    }
}
