import java.util.ArrayList;
import java.io.File;
import java.awt.Color;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

/**
 * Beschreiben Sie hier die Klasse Image.
 * 
 * @author Alexander Kimmig 
 * @version 1.0
 */
public class Image
{
    /**
     * Liest eine JPG-Bilddatei ein und gibt diese als ArrayList von RGB-Objekten zurück
     * 
     * @param filename Dateiname die eingelesen werden soll
     * @return ArrayList<RGB> der einzelnen Pixelwerte
     * @throws Exception
     */
    public static ArrayList<RGB> readFile(String filename) throws Exception {
        ArrayList<RGB> points = new ArrayList<>();
        
        File file= new File(filename);
        BufferedImage img = ImageIO.read(file);
        for (int y = 0; y < img.getHeight(); y++) {
            for (int x = 0; x < img.getWidth(); x++) {
                points.add(new RGB(img.getRGB(x,y)));
            }
        }
        
        return points;
    }
    
    /**
     * Schreibt die RGB-Daten in eine Datei
     * 
     * @param input Dateiname der ursprünglichen Datei (wird für Dimensionen gebraucht)
     * @param output Dateiname der neuen Datei
     * @param data RGB-Daten der einzelnen Pixel
     */
    public static void writeFile(String input, String output, ArrayList<RGB> data) throws Exception {
        File file = new File(input);
        BufferedImage img = ImageIO.read(file);
        
        int w = img.getWidth();
        int y = 0, x = 0;
        for (RGB p : data) {
            img.setRGB(x, y, p.toInt());
            if (++x >= w) {
                x = 0;
                ++y;
            }
        }
        
        File f = new File(output);
        ImageIO.write(img, "jpg", f);
    }
    
    /**
     * Schreibt die RGB-Daten in eine Datei anhand der Quantifizierungs-Punkte
     * Jeder Pixel bekommt die Farbe des nächstliegenden Quantifizierungs-Punktes.
     * 
     * @param input Dateiname der ursprünglichen Datei (wird für Dimensionen gebraucht)
     * @param output Dateiname der neuen Datei
     * @param data RGB-Daten der einzelnen Pixel
     * @param quants Quantifizierungs-Punkte
     */
    public static void writeFile(String input, String target, ArrayList<RGB> data, ArrayList<RGB> quants) throws Exception {
        ArrayList<RGB> q = new ArrayList<>();
        
        // Mappe punkte auf quantifizierte Punkte
        for (RGB p : data) {
            q.add(Quant.findNearest(quants, p));
        }
        
        // schreibe Datei
        writeFile(input, target, q);
    }
}
