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

import static io.webfolder.cdp.JsonLibrary.Jackson;
import static io.webfolder.cdp.event.Events.PageScreencastFrame;
import static io.webfolder.cdp.logger.CdpLoggerType.Console;
import static io.webfolder.cdp.logger.CdpLogggerLevel.Info;
import static java.awt.Desktop.getDesktop;
import static java.awt.Desktop.isDesktopSupported;
import static java.util.EnumSet.of;

import java.io.IOException;

import io.webfolder.cdp.Example;
import io.webfolder.cdp.Launcher;
import io.webfolder.cdp.Options;
import io.webfolder.cdp.session.Session;
import io.webfolder.cdp.session.SessionFactory;
import io.webfolder.cdp.session.VideoRecorder;
import io.webfolder.cdp.session.VideoRecorderOptions;
import io.webfolder.cdp.session.VideoRecorderResult;

// Unlike to FFmpegVideoRecorder, this examples encodes the recorded video in realtime.
// cdp4j uses Cisco's openh264 encoder and IHMC Java Video Codecs library.
// 
// openh264   : https://github.com/cisco/openh264
// JNI binding: https://github.com/ihmcrobotics/ihmc-video-codecs
//
@Example
public class VideoRecorderRealtimeExample {

    public static void main(String[] args) {
        Launcher launcher = new Launcher(Options.builder()
                                                .loggerType(Console)
                                                .consoleLoggerLevel(Info)
                                                .jsonLibrary(Jackson)
                                            .build());

        try (SessionFactory factory = launcher.launch();
                            Session session = factory.create()) {

            session.setRegisteredEventListeners(of(PageScreencastFrame));

            VideoRecorder recorder = session.createRealtimeVideoRecoder(
                VideoRecorderOptions.builder()
                                    .videoFileName("out.mp4") // default file extension is webm, don't forget to change the file extension
                                    .build()
            );

            recorder.start();

            session
                .navigate("https://webkit.org/blog-files/3d-transforms/poster-circle.html")
                .waitDocumentReady()
                .wait(5_000);

            session.navigate("https://yahoo.com");
            for (int i = 0; i < 50; i++) {
                session.wait(100);
                session.evaluate("window.scrollBy(0,10)");
            }

            recorder.stop();

            VideoRecorderResult result = recorder.encode();

            if (result.isSucceess() && isDesktopSupported()) {
                try {
                    getDesktop().open(result.getVideoFile().toFile());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}