/*
 * 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.Arrays.asList;
import static java.util.EnumSet.of;

import java.io.IOException;
import java.util.List;

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;

//
// Record video and encode with vp8 encoder
//
// This example uses installed ffmpeg from host environment
// Make sure that ffmpeg exist in PATH environment variable
//
@Example
public class VideoRecorderExampleLibx264 {


    public static void main(String[] args) {
        System.out.println("Make sure that ffmpeg executable exist in PATH variable!");

        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));

            // encoding parameters for libx264
            List<String> libx264Args = asList(new String[] {
                                            "-vcodec",
                                            "libx264",
                                            "-pix_fmt",
                                            "yuv420p",
                                            "-r",
                                            "25",
                                            "-an",
                                        });

            VideoRecorder recorder = session.createVideoRecoder(
                VideoRecorderOptions.builder()
                                    .ffmpegExecutable("ffmpeg") // use ffmpeg from env path
                                    .videoFileName("video.mp4") // use mp4 extension
                                    .ffmpegArgs(libx264Args)
                                .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);
                }
            }
        }
    }
}