package fr.iutfbleau.sae.mhuffman;

import fr.iutfbleau.sae.mpif.Pixel;
import fr.iutfbleau.sae.mpif.RGBImage;

/**
 * 
 * Classe qui calcule les fréquences des valeurs de couleur dans une image RGB.
 * Elle compte combien de fois chaque valeur de rouge, vert et bleu apparaît,
 * ce qui servira ensuite pour construire les arbres de Huffman.
 */
public class FrequencyTable {

    /** Fréquences des valeurs de rouge entre 0 et 255. */
    private final int[] freqR;

    /** Fréquences des valeurs de vert entre 0 et 255. */
    private final int[] freqG;

    /** Fréquences des valeurs de bleu entre 0 et 255. */
    private final int[] freqB;

    /**
     * Constructeur qui initialise les trois tableaux de fréquences
     * à zéro pour toutes les valeurs possibles.
     */
    public FrequencyTable() {
        this.freqR = new int[256];
        this.freqG = new int[256];
        this.freqB = new int[256];
    }

    /**
     * Analyse une image et remplit les tableaux de fréquences.
     * Pour chaque pixel, on récupère la valeur de rouge, de vert et de bleu,
     * puis on incrémente la fréquence associée.
     *
     * @param img l'image à analyser
     * @throws IllegalArgumentException si l'image est nulle
     */
    public void computeFromImage(RGBImage img) {
        if (img == null) {
            throw new IllegalArgumentException("L'image ne peut pas être null");
        }

        for (int x = 0; x < img.getWidth(); x++) {
            for (int y = 0; y < img.getHeight(); y++) {

                Pixel pixel = img.getPixel(x, y);

                this.freqR[pixel.getR()]++;
                this.freqG[pixel.getG()]++;
                this.freqB[pixel.getB()]++;
            }
        }
    }

    /**
     * Renvoie les fréquences des valeurs rouges.
     *
     * @return tableau de fréquence pour le rouge
     */
    public int[] getRed() {
        return this.freqR;
    }

    /**
     * Renvoie les fréquences des valeurs vertes.
     *
     * @return tableau de fréquence pour le vert
     */
    public int[] getGreen() {
        return this.freqG;
    }

    /**
     * Renvoie les fréquences des valeurs bleues.
     *
     * @return tableau de fréquence pour le bleu
     */
    public int[] getBlue() {
        return this.freqB;
    }
}
