/*
 * https://webfolder.io/license.html
 */
package io.webfolder.cdp.sample;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.concurrent.CountDownLatch;

import io.webfolder.cdp.Example;
import io.webfolder.cdp.Launcher;
import io.webfolder.cdp.command.Browser;
import io.webfolder.cdp.command.Page;
import io.webfolder.cdp.event.Events;
import io.webfolder.cdp.event.page.DownloadProgress;
import io.webfolder.cdp.event.page.DownloadWillBegin;
import io.webfolder.cdp.session.Session;
import io.webfolder.cdp.session.SessionFactory;
import io.webfolder.cdp.type.constant.DownloadBehavior;
import io.webfolder.cdp.type.constant.DownloadState;

@Example
public class DownloadFile {

    public static void main(String[] args) throws IOException, InterruptedException {
        Launcher launcher = new Launcher();

        try (SessionFactory factory = launcher.launch();
                            Session session = factory.create()) {
            session.navigate("https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html");
            session.waitDocumentReady();

            Page page = session.getCommand().getPage();
            // this is required to capture download events
            page.enable();
            
            Browser browser = session.getCommand().getBrowser();

            Path tempDir = Files.createTempDirectory("download").toAbsolutePath();
            System.out.println(tempDir);

            browser.setDownloadBehavior(DownloadBehavior.Allow,
                                        null,
                                        tempDir.toString(),
                                        Boolean.TRUE);

            // link must be visible before downloading the file
            session.evaluate("document.querySelector(\"code\").scrollIntoView()");
            // click the download link
            session.click("code");
            CountDownLatch latch = new CountDownLatch(1);
            session.addEventListener((event, value) -> {
                // important!
                //
                // if chrome version is equal less than 90, chrome triggers PageDownloadProgress
                // otherwise chrome triggers BrowserDownloadProgress (chrome version >= 92)
                // based on your chrome version, you can simplify this logic
                //
                if (Events.PageDownloadProgress == event) {
                    DownloadProgress dp1 = (DownloadProgress) value;
                    System.out.println("download state: " + dp1.getState() + ", rceivedBytes: " + dp1.getReceivedBytes());
                    if (DownloadState.Completed == dp1.getState()) {
                        latch.countDown();
                    }
                } else if (Events.BrowserDownloadProgress == event) {
                    io.webfolder.cdp.event.browser.DownloadProgress dp2 = (io.webfolder.cdp.event.browser.DownloadProgress) value;
                    System.out.println("download state: " + dp2.getState() + ", rceivedBytes: " + dp2.getReceivedBytes());
                    if (DownloadState.Completed == dp2.getState()) {
                        latch.countDown();
                    }
                } else if (Events.PageDownloadWillBegin == event) {
                    DownloadWillBegin begin1 = (DownloadWillBegin) value;
                    System.out.println("download started: " + begin1.getSuggestedFilename()
                            + ", url: " + begin1.getUrl());
                } else if (Events.BrowserDownloadWillBegin == event) {
                    io.webfolder.cdp.event.browser.DownloadWillBegin begin2 = (io.webfolder.cdp.event.browser.DownloadWillBegin) value;
                    System.out.println("download started: " + begin2.getSuggestedFilename()
                            + ", url: " + begin2.getUrl());
                }
            });
            latch.await();
        } finally {
            launcher.kill();
        }
    }
}