import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.concurrent.Worker;
import javafx.geometry.Dimension2D;
import javafx.print.Printer;
import javafx.print.PrinterJob;
import javafx.scene.Scene;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import javafx.util.Duration;

public class JfxLoadingBugTest extends Application {

    private static WebView webView;
    private static PauseTransition transition;
    private static final String URL = "https://gluonhq.com";
    // private static final String URL = "http://lodgon.com";

    @Override
    public void start(Stage st) {
        webView = new WebView();
        st.setScene(new Scene(webView));

        //setup load listeners
        Worker<Void> worker = webView.getEngine().getLoadWorker();
        worker.stateProperty().addListener(stateListener);
        worker.exceptionProperty().addListener((obs, oldEx, newEx) -> {
            if (newEx != null) { newEx.printStackTrace(); }
        });

        //prevents JavaFX from shutting down when hiding window
        Platform.setImplicitExit(false);
        System.out.println("Started JFX");
        Printer printer = Printer.getDefaultPrinter();
        loadAndPrint(printer);
    }

    /** Called by jfx thread on content load */
    private static ChangeListener<Worker.State> stateListener = (ov, oldState, newState) -> {
        System.out.println("WebState change: " + oldState + " -> " + newState);

        if (newState == Worker.State.SUCCEEDED) {
            //resize the view
            Dimension2D dimensions = new Dimension2D(1080, 1920);
            webView.setMinSize(dimensions.getWidth(), dimensions.getHeight());
            webView.setPrefSize(dimensions.getWidth(), dimensions.getHeight());
            webView.setMaxSize(dimensions.getWidth(), dimensions.getHeight());
            webView.autosize();

            //hand off to print lambda
            transition.playFromStart();
        }
    };

    private static void loadAndPrint(Printer printer) {
        transition = new PauseTransition(Duration.millis(100));
        transition.setOnFinished(evt -> {
            Platform.runLater(() -> doPrint(printer));
        });
        //reset webview and start loading
        Platform.runLater(() -> {
            webView.getTransforms().clear();
            webView.getEngine().load(URL);
        });
    }

    private static void doPrint(Printer printer) {
        PrinterJob job = PrinterJob.createPrinterJob(printer);
        System.out.println("Sending to printer");
        job.printPage(webView);
        job.endJob();
        System.out.println("Done sending to printer");
        Platform.exit();
    }
}
