import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.input.KeyEvent;
import javafx.stage.Stage;

import java.util.HashSet;

public class Example4K extends Application
{
    public static void main(String[] args)
    {
        launch(args);
    }

    static Scene mainScene;
    static GraphicsContext graphicsContext;
    static int WIDTH = 512;
    static int HEIGHT = 256;

    static Image left;
    static Image leftGreen;

    static Image right;
    static Image rightGreen;

    static HashSet<String> currentlyActiveKeys;

    @Override
    public void start(Stage mainStage)
    {
        mainStage.setTitle("Event Handling");

        Group root = new Group();
        mainScene = new Scene(root);
        mainStage.setScene(mainScene);

        Canvas canvas = new Canvas(WIDTH, HEIGHT);
        root.getChildren().add(canvas);

        prepareActionHandlers();

        graphicsContext = canvas.getGraphicsContext2D();

        loadGraphics();

        /**
         * Main "game" loop
         */
        new AnimationTimer()
        {
            public void handle(long currentNanoTime)
            {
                tickAndRender();
            }
        }.start();

        mainStage.show();
    }

    private static void prepareActionHandlers()
    {
        // use a set so duplicates are not possible
        currentlyActiveKeys = new HashSet<String>();
        mainScene.setOnKeyPressed(new EventHandler<KeyEvent>()
        {
            @Override
            public void handle(KeyEvent event)
            {
                currentlyActiveKeys.add(event.getCode().toString());
            }
        });
        mainScene.setOnKeyReleased(new EventHandler<KeyEvent>()
        {
            @Override
            public void handle(KeyEvent event)
            {
                currentlyActiveKeys.remove(event.getCode().toString());
            }
        });
    }

    private static void loadGraphics()
    {
        left = new Image(getResource("left.png"));
        leftGreen = new Image(getResource("leftG.png"));

        right = new Image(getResource("right.png"));
        rightGreen = new Image(getResource("rightG.png"));
    }

    private static String getResource(String filename)
    {
        return Example4K.class.getResource(filename).toString();
    }

    private static void tickAndRender()
    {
        // clear canvas
        graphicsContext.clearRect(0, 0, WIDTH, HEIGHT);

        if (currentlyActiveKeys.contains("LEFT"))
        {
            graphicsContext.drawImage(leftGreen, 64 ,64);
        }
        else
        {
            graphicsContext.drawImage(left, 64 ,64);
        }

        if (currentlyActiveKeys.contains("RIGHT"))
        {
            graphicsContext.drawImage(rightGreen, 320, 64);
        }
        else
        {
            graphicsContext.drawImage(right, 320, 64);
        }
    }
}