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

import static io.webfolder.cdp.event.Events.NetworkRequestWillBeSent;

import java.io.IOException;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.ObjectReader;

import io.webfolder.cdp.Example;
import io.webfolder.cdp.JsonLibrary;
import io.webfolder.cdp.Launcher;
import io.webfolder.cdp.Options;
import io.webfolder.cdp.event.Events;
import io.webfolder.cdp.serialization.DefaultEventParser;
import io.webfolder.cdp.session.Session;
import io.webfolder.cdp.session.SessionFactory;

@Example
public class CustomEventParser {

    private static class RequestInfo {
        public String requestId, url;
        @Override
        public String toString() {
            return "RequestInfo [requestId=" + requestId + ", url=" + url + "]";
        }
    }

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

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

            session.getCommand().getNetwork().enable();

            // this custom event parser skip unused/unwanted fields
            // this usage help to decrease memory and CPU usage
            session.setEventParser(new DefaultEventParser() {

                @Override
                @SuppressWarnings("unused")
                public Object parse(Events       event,
                                    Session      session,
                                    JsonParser   parser,
                                    ObjectReader reader)
                                    throws IOException {
                    switch (event) {
                        case NetworkRequestWillBeSent:
                            RequestInfo nws = new RequestInfo();
                            JsonToken token = null;
                            while ( (token = parser.nextToken()) != null ) {
                                String name = parser.currentName();
                                if ("requestId".equals(name)) {
                                    nws.requestId = parser.getValueAsString();
                                } else if ("url".equals(name)) {
                                    nws.url = parser.getValueAsString();
                                }
                            }
                            return nws;
                        default:
                            return super.parse(event, session, parser, reader);
                    }
                }
            });

            session.addEventListener((event, value) -> {
                if (event == NetworkRequestWillBeSent) {
                    RequestInfo ri = (RequestInfo) value;
                    System.out.println(ri);
                }
            });

            session.navigate("https://yahoo.com");
            session.waitDocumentReady();
        } finally {
            launcher.kill();
        }
    }
}