package uikit;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.image.codec.jpeg.ImageFormatException;
import com.anotherbigidea.flash.movie.*;
import com.anotherbigidea.flash.movie.Shape;

import java.awt.*;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.*;


public class ScreenCamera {
    private final File outputFile;
    private Movie movie;
    private int[] size;

    public ScreenCamera(File outputFile) {
        this.outputFile = outputFile;
        Dimension myScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
        size = new int[]{(int)myScreenSize.getWidth(),(int)myScreenSize.getHeight() };
        movie = new Movie( size[0]+ 10, size[1] + 10, 1, 5, null);
    }

    InputStream aquireImage() {
        Dimension myScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
        try {
            BufferedImage IJ = new Robot().createScreenCapture(new
                    Rectangle(new Point(0, 0),
                    myScreenSize));
            ByteArrayOutputStream fos = new ByteArrayOutputStream();
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
            JPEGEncodeParam par = encoder.getDefaultJPEGEncodeParam(IJ);
            par.setQuality((float) 0.80, true);
            encoder.setJPEGEncodeParam(par);
            encoder.encode(IJ);
            fos.flush();
            fos.close();

            return new ByteArrayInputStream(fos.toByteArray());
        } catch (AWTException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

    public void takeScreenShot() {

        try {
            Shape image = ImageUtil.shapeForImage(aquireImage(),size);
            movie.appendFrame().placeSymbol(image, 5, 5);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }


    }

    public void close(){
        try {
            movie.write(outputFile.getAbsolutePath());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}
