package de.northtommy.playwrightmini;

import java.io.File;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;

import io.github.kihdev.playwright.stealth4j.Stealth4j;
import io.github.kihdev.playwright.stealth4j.Stealth4jConfig;

public class PlaywrightGoogleMini {
    private static final String DEFAULT_URL = "https://www.google.de/";

    public static void main(String[] args) {
        Config config = Config.fromArgs(args);

        System.out.println("Playwright Mini");
        System.out.println("URL: " + config.url);
        System.out.println("Headless: " + config.headless);
        System.out.println("Firefox path: " + (config.firefoxPath == null ? "<Playwright Firefox>" : config.firefoxPath));
        System.out.println("Proxy: " + (config.proxy == null ? "<none>" : config.proxy));

        Browser browser = null;
        BrowserContext context = null;

        System.out.println("Creating Playwright...");
        try (Playwright playwright = Playwright.create()) {
            BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions()
                    .setHeadless(config.headless);

            if (config.proxy != null && !config.proxy.trim().isEmpty()) {
                launchOptions.setProxy(config.proxy);
            }

            if (config.firefoxPath != null && !config.firefoxPath.trim().isEmpty()) {
                File ffFile = new File(config.firefoxPath);
                if (!ffFile.isFile()) {
                    throw new IllegalArgumentException("Firefox path is not a file: " + config.firefoxPath);
                }
                if (!ffFile.canExecute()) {
                    throw new IllegalArgumentException("Firefox path is not executable: " + config.firefoxPath);
                }
                launchOptions.setExecutablePath(Paths.get(config.firefoxPath));
            }

            System.out.println("Starting Firefox...");
            browser = playwright.firefox().launch(launchOptions);

            System.out.println("Creating stealth context...");
            context = Stealth4j.newStealthContext(
                    browser,
                    Stealth4jConfig.builder()
                            .navigatorLanguages(true, List.of("de-DE", "de"))
                            .build());
            context.setExtraHTTPHeaders(Map.of("DNT", "1"));

            Page page = context.newPage();
            System.out.println("Opening " + config.url + "...");
            page.navigate(config.url);
            page.waitForLoadState();

            System.out.println("Loaded title: " + page.title());
            System.out.println("Current URL: " + page.url());

            if (!config.headless) {
                System.out.println("Browser stays open for " + config.keepOpenSeconds + " seconds.");
                Thread.sleep(config.keepOpenSeconds * 1000L);
            }
        } catch (Throwable t) {
            System.err.println("Playwright failed:");
            t.printStackTrace(System.err);
            System.exit(1);
        } finally {
            if (context != null) {
                context.close();
            }
            if (browser != null) {
                browser.close();
            }
        }
    }

    private static class Config {
        private String url = DEFAULT_URL;
        private String firefoxPath;
        private String proxy;
        private boolean headless = true;
        private int keepOpenSeconds = 15;

        private static Config fromArgs(String[] args) {
            Config config = new Config();
            Arrays.stream(args).forEach(arg -> {
                if ("--headed".equals(arg)) {
                    config.headless = false;
                } else if ("--headless".equals(arg)) {
                    config.headless = true;
                } else if (arg.startsWith("--firefox=")) {
                    config.firefoxPath = arg.substring("--firefox=".length());
                } else if (arg.startsWith("--proxy=")) {
                    config.proxy = arg.substring("--proxy=".length());
                } else if (arg.startsWith("--url=")) {
                    config.url = arg.substring("--url=".length());
                } else if (arg.startsWith("--keep-open=")) {
                    config.keepOpenSeconds = Integer.parseInt(arg.substring("--keep-open=".length()));
                } else if ("--help".equals(arg) || "-h".equals(arg)) {
                    printHelpAndExit();
                } else {
                    throw new IllegalArgumentException("Unknown argument: " + arg);
                }
            });
            return config;
        }

        private static void printHelpAndExit() {
            System.out.println("Usage:");
            System.out.println("  java -jar playwright-google-mini.jar [options]");
            System.out.println();
            System.out.println("Options:");
            System.out.println("  --headed                         Show browser window");
            System.out.println("  --headless                       Run without browser window, default");
            System.out.println("  --firefox=C:\\Path\\firefox.exe    Use installed Firefox");
            System.out.println("  --proxy=http://host:port         Use proxy, same value shape as syncNorthTommy");
            System.out.println("  --url=https://www.google.de/     URL to open");
            System.out.println("  --keep-open=15                  Seconds to keep headed browser open");
            System.exit(0);
        }
    }
}
