package fr.iutfbleau.sae;

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

import java.awt.image.BufferedImage;
import java.io.File;
import javax.swing.JFileChooser;

/**
 * Controleur du visualiseur d'images PIF.
 * Gere le chargement du fichier PIF et la conversion en image affichable.
 */
public class ViewerControleur {

    private RGBImage image; // L'image a decoder
    private ViewerWindow window; // La fenetre du visualiseur
    private File file;

    /**
     * Constructeur du controleur.
     *
     * @param window la fenetre du visualiseur
     * @param path le chemin du fichier PIF ou null si aucun
     */
    public ViewerControleur(ViewerWindow window, String path) {
        this.window = window;
        if (path != null) {
            this.file = new File(path);
        } else {
            this.file = null;
        }
    }

    /**
     * Charge et affiche un fichier PIF.
     * Si aucun fichier n'est fourni, ouvre un selecteur de fichier.
     * Verifie que le fichier est au format PIF puis le decode et l'affiche.
     */
    public void loadPIF() {
        File fichierPIF;
        // Determiner si on le charge avec jFilechoose ou pas
        if (this.file != null) {
            // Fichier fourni en argument
            fichierPIF = this.file;
        } else {
            // Demander a l'utilisateur via JFileChooser
            JFileChooser chooser = new JFileChooser();
            chooser.setDialogTitle("Choisissez un fichier PIF");

            if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                fichierPIF = chooser.getSelectedFile();
            } else {
                GestionErreur.afficherErreur("Aucun fichier sélectionné. Arrêt du programme.");
                System.exit(1);
                return;
            }
        }

        // je Verifie la conformite du fichier avec isPIFFile
        if (!PIFReader.isPIFFile(fichierPIF)) {
            GestionErreur.afficherErreur("Le fichier fourni n'est pas au format PIF (.pif)");
            return;
        }

        // je Charge et decode le fichier PIF
        try {
            PIFReader lecteur = new PIFReader();
            this.image = lecteur.decodePifFile(fichierPIF);

            // je convertit RGBImage en BufferedImage
            BufferedImage buffImg = convertToBufferedImage(this.image);

            // j'affiche l'image
            this.window.displayImage(buffImg);

        } catch (Exception e) {
            GestionErreur.afficherErreur("Erreur lors du chargement du fichier PIF : ");
        }
    }

    /**
     * Convertit une RGBImage en BufferedImage.
     * Parcourt tous les pixels et compose la couleur RGB sur 32 bits.
     *
     * @param rgbImage l'image a convertir
     * @return l'image convertie en BufferedImage
     */
    private BufferedImage convertToBufferedImage(RGBImage rgbImage) {
        int width = rgbImage.getWidth();
        int height = rgbImage.getHeight();

        BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        // Copier tous les pixels
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                Pixel pixel = rgbImage.getPixel(x, y);

                // Composer la couleur RGB la couleur est coder sur 32 bit argb chacun a 8 bit
                int rgb = (pixel.getR() << 16) | (pixel.getG() << 8) | pixel.getB();

                // Definir le pixel dans le BufferedImage
                buffImg.setRGB(x, y, rgb);
            }
        }

        return buffImg;
    }
}
