package jfxfeatures.graphics.shapes.paths.performance;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.stage.Stage;

public class TestRandomPathFX extends Application {
	
	//############################### change configuration here
    private static int numberLines = 10_000;
    private static boolean usePath = true;
    private static boolean useOffset = false;
    private static boolean limitScale = true;
    //#########################################################
    
    private float scale;
    private float coordMinX;
    private float coordMaxX;
    private float coordMinY;
    private float coordMaxY;
    
    Pane pane;
    Group graphRoot;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        stage.setTitle("TestRandomPathFX");
        pane = new Pane();
        graphRoot = new Group();
        graphRoot.setManaged(false);
        pane.getChildren().add(graphRoot);
        final Scene scene = new Scene(pane, 800, 800, Color.WHITE);
        addMouseHandler();
        stage.setScene(scene);
        stage.show();

        scale=1;
        coordMinX = 100;
        coordMaxX = 700;
        coordMinY = 100;
        coordMaxY = 700;
        
        makeRandom();
        zoom();
    }

    private void addMouseHandler() {
        pane.addEventHandler(ScrollEvent.SCROLL, new EventHandler<ScrollEvent>() {
			@Override
			public void handle(ScrollEvent e) {
    			double val = e.getDeltaY();		
    			if (val < 0) { // Opposite to Swing version
    				scale *= 0.9;
    			} else {
    				scale *= 1.1;
    			}
    			if (limitScale) {
    				scale = Math.min(1.0f, scale);
    			}
    			zoom();
			}
        });

    }

    private void makeRandom() {
		long t0 = System.currentTimeMillis();

        float pXstart;
        float pYstart;
        float pXend;
        float pYend;

        Path path = null;

        for (int i = 0; i < numberLines; i++) {
            pXstart = coordMinX + (float) Math.random() * ((coordMaxX - coordMinX) + 1);
            pYstart = coordMinY + (float) (Math.random() * ((coordMaxY - coordMinY) + 1));
            pXend = coordMinX + (float) (Math.random() * ((coordMaxX - coordMinX) + 1));
            pYend = coordMinY + (float) (Math.random() * ((coordMaxY - coordMinY) + 1));

            if (usePath) {
	            // for Path use this code
            	if (path == null) {
	            	path = new Path();
	            	graphRoot.getChildren().add(path);
            	}
	            MoveTo start = new MoveTo(pXstart, pYstart);
	            LineTo end = new LineTo(pXend, pYend);
	            path.getElements().addAll(start, end);
            } else {
	            // for Line use this code
	            graphRoot.getChildren().add(new Line(pXstart, pYstart, pXend, pYend));
	        }
        }
        
		long t1 = System.currentTimeMillis();
		if (usePath) {
			System.out.println("Creating path with " + numberLines + " lines took " + (t1-t0) + " ms.");
		} else {
			System.out.println("Creating " + numberLines + " lines took " + (t1-t0) + " ms.");
		}
    }
    
    private void zoom() {
    	if (useOffset) {
	    	graphRoot.setTranslateX(200.0);
	    	graphRoot.setTranslateY(200.0);
    	}
        graphRoot.setScaleX(scale);
        graphRoot.setScaleY(scale);
    }

}