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

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import io.webfolder.cdp.Example;
import io.webfolder.cdp.Launcher;
import io.webfolder.cdp.event.Events;
import io.webfolder.cdp.event.target.TargetCreated;
import io.webfolder.cdp.event.target.TargetDestroyed;
import io.webfolder.cdp.listener.EventListener;
import io.webfolder.cdp.session.Session;
import io.webfolder.cdp.session.SessionFactory;
import io.webfolder.cdp.type.target.TargetInfo;

@Example
public class ConnectExistingSession {

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

        SessionFactory factory = launcher.launch();

        Session dummySession = factory.create();

        Set<String> existingTargets = new HashSet<>();

        for (int i = 0; i < 5; i++) {
            Session session = factory.create();
            session.navigate("about:blank?" + i);
            existingTargets.add(session.getTargetId());
        }

        dummySession.addEventListener(new EventListener() {
            
            @Override
            public void onEvent(Events event, Object value) {
                if (Events.TargetTargetCreated.equals(event)) {
                    TargetCreated tc = (TargetCreated) value;
                    System.out.println("target created: " + tc.getTargetInfo().getUrl());
                } else if (Events.TargetTargetDestroyed.equals(event)) {
                    TargetDestroyed td = (TargetDestroyed) value;
                    System.out.println("target destroyed: " + td.getTargetId());
                }
                
            }
        });

        List<TargetInfo> targets = dummySession.getCommand()
                                               .getTarget()
                                               .getTargets();

        for (TargetInfo next : targets) {
            // skip if target is not page
            if (! "page".equals(next.getType()) ) {
                continue;
            }
            // skip if target is new tab or chrome's internal tab/page
            if ( next.getUrl().startsWith("chrome://") ) {
                continue;
            }
            Session session = factory.connect(next.getTargetId());
            if ( ! existingTargets.contains(session.getTargetId()) ) {
                throw new IllegalStateException();
            }
            session.close();
        }

        Thread.sleep(2000);

        Runtime.getRuntime().addShutdownHook(new Thread(() -> launcher.kill()));
    }
}