package fr.iutfbleau.sae;

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

/**
 * Panneau d'aperçu de l'image.
 *
 * Ce panneau est utilisé pour afficher l'image chargée dans le convertisseur.
 * Si l'image est trop grande, elle est automatiquement réduite.
 * Si elle est plus petite que l'espace disponible, elle est centrée.
 */
public class ImagePreviewPanel extends JPanel {

    /** Image affichée dans le panneau */
    private BufferedImage image;

    /** Taille maximale pour l'affichage */
    private static final int MAX_WIDTH = 800;
    private static final int MAX_HEIGHT = 600;

    /**
     * Constructeur du panneau d'aperçu.
     */
    public ImagePreviewPanel() {
        setPreferredSize(new Dimension(MAX_WIDTH, MAX_HEIGHT));
    }

    /**
     * Met à jour l'image à afficher et demande le rafraîchissement du panneau.
     *
     * @param img l'image à afficher
     */
    public void setImage(BufferedImage img) {
        this.image = img;
        
        // Recalculer la taille préférée selon l'image
        if (image != null) {
            int imgWidth = image.getWidth();
            int imgHeight = image.getHeight();
            
            // Calculer la taille d'affichage
            double scale = Math.min(
                (double) MAX_WIDTH / imgWidth,
                (double) MAX_HEIGHT / imgHeight
            );
            
            if (scale > 1.0) {
                scale = 1.0;
            }
            
            int prefWidth = Math.max((int) (imgWidth * scale), MAX_WIDTH);
            int prefHeight = Math.max((int) (imgHeight * scale), MAX_HEIGHT);
            
            setPreferredSize(new Dimension(prefWidth, prefHeight));
        }
        
        revalidate();
        repaint();
    }

    /**
     * Affiche l'image dans le panneau.
     * L'image est centrée et éventuellement réduite si elle dépasse la taille du panneau.
     */
    @Override
    protected void paintComponent(Graphics pinceau) {
        super.paintComponent(pinceau);

        if (image == null) {
            return;
        }

        int panelWidth = getWidth();
        int panelHeight = getHeight();

        int imgWidth = image.getWidth();
        int imgHeight = image.getHeight();

        double scale = Math.min(
            (double) panelWidth / imgWidth,
            (double) panelHeight / imgHeight
        );

        if (scale > 1.0) {
            scale = 1.0;
        }

        int drawWidth = (int) (imgWidth * scale);
        int drawHeight = (int) (imgHeight * scale);

        int x = (panelWidth - drawWidth) / 2;
        int y = (panelHeight - drawHeight) / 2;

        // Amélioration de la qualité du redimensionnement
        Graphics2D pinceau2D = (Graphics2D) pinceau;
        pinceau2D.setRenderingHint(
            RenderingHints.KEY_INTERPOLATION,
            RenderingHints.VALUE_INTERPOLATION_BILINEAR
        );
        pinceau2D.setRenderingHint(
            RenderingHints.KEY_RENDERING,
            RenderingHints.VALUE_RENDER_QUALITY // Je privilege la qualite au lieu de la vitesse 
        );

        pinceau2D.drawImage(image, x, y, drawWidth, drawHeight, this);
    }
}
