package fr.iutfbleau.sae;

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

/**
 * Panneau d'affichage des codes Huffman et canoniques.
 * Affiche les codes pour chaque composante de couleur (rouge, vert, bleu).
 */
public class CodeTablePanel extends JPanel {
    
    // Zones de texte pour les codes Huffman
    private JTextArea textHuffRouge, textHuffVert, textHuffBleu;
    
    // Zones de texte pour les codes canoniques
    private JTextArea textCanonRouge, textCanonVert, textCanonBleu;

    /**
     * Constructeur qui initialise l'interface utilisateur.
     */
    public CodeTablePanel() {
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));

        // Titre pour les codes Huffman
        JLabel titreHuff = new JLabel("Codes Huffman");
        titreHuff.setFont(new Font("SansSerif", Font.BOLD, 16));
        add(titreHuff);
        add(Box.createVerticalStrut(10));

        // Création des zones de texte pour les codes Huffman
        textHuffRouge = creerZoneTexte("Rouge");
        textHuffVert = creerZoneTexte("Vert");
        textHuffBleu = creerZoneTexte("Bleu");

        // Séparateur
        add(Box.createVerticalStrut(20));

        // Titre pour les codes canoniques
        JLabel titreCanon = new JLabel("Codes Canoniques");
        titreCanon.setFont(new Font("SansSerif", Font.BOLD, 16));
        add(titreCanon);
        add(Box.createVerticalStrut(10));

        // Création des zones de texte pour les codes canoniques
        textCanonRouge = creerZoneTexte("Rouge (Canonique)");
        textCanonVert = creerZoneTexte("Vert (Canonique)");
        textCanonBleu = creerZoneTexte("Bleu (Canonique)");
    }

    /**
     * Crée une zone de texte avec une étiquette.
     * @param titre Le titre à afficher au-dessus de la zone de texte
     * @return La zone de texte configurée
     */
    private JTextArea creerZoneTexte(String titre) {
        add(new JLabel(titre + ":"));
        JTextArea zone = new JTextArea(8, 30);
        zone.setEditable(false);
        zone.setFont(new Font("Monospaced", Font.PLAIN, 12));
        JScrollPane scroll = new JScrollPane(zone);
        scroll.setPreferredSize(new Dimension(300, 120));
        add(scroll);
        add(Box.createVerticalStrut(10));
        return zone;
    }

    /**
     * Met à jour l'affichage des codes Huffman.
     * @param rouge Les codes pour la composante rouge
     * @param vert Les codes pour la composante verte
     * @param bleu Les codes pour la composante bleue
     */
    public void updateCodes(Map<Integer, String> rouge, 
                          Map<Integer, String> vert, 
                          Map<Integer, String> bleu) {
        mettreAJourZoneTexte(textHuffRouge, rouge);
        mettreAJourZoneTexte(textHuffVert, vert);
        mettreAJourZoneTexte(textHuffBleu, bleu);
    }

    /**
     * Met à jour l'affichage des codes canoniques.
     * @param rouge Les codes pour la composante rouge
     * @param vert Les codes pour la composante verte
     * @param bleu Les codes pour la composante bleue
     */
    public void updateCanonicalCodes(Map<Integer, String> rouge, 
                                   Map<Integer, String> vert, 
                                   Map<Integer, String> bleu) {
        mettreAJourZoneTexte(textCanonRouge, rouge);
        mettreAJourZoneTexte(textCanonVert, vert);
        mettreAJourZoneTexte(textCanonBleu, bleu);
    }

    /**
     * Met à jour le contenu d'une zone de texte avec les codes fournis.
     * @param zone La zone de texte à mettre à jour
     * @param codes Les codes à afficher
     */
    private void mettreAJourZoneTexte(JTextArea zone, Map<Integer, String> codes) {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<Integer, String> entry : codes.entrySet()) {
            sb.append(String.format("%3d : %s%n", entry.getKey(), entry.getValue()));
        }
        zone.setText(sb.toString());
    }
}