import puppeteer from "https://deno.land/x/puppeteer@9.0.2/mod.ts";
import { parse as argParse } from "https://deno.land/std@0.136.0/flags/mod.ts";
import {join as pathJoin} from "https://deno.land/std@0.136.0/path/mod.ts"; 

const executablePathMap = {
    windows: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
            //"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
    darwin: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
    linux: "/usr/bin/chromium-browser",
};

function findChromeDir(){
    const dir = executablePathMap[Deno.build.os];
    if (Deno.build.os === "linux"){
        const pathes = Deno.env.get("PATH")?.split(";");
        if(!pathes){
            return dir;
        }
        for (const path of pathes){
            const entries = [...Deno.readDirSync(path)];
            const chrome = entries.find((entry) => entry.name === "chrome");
            if(chrome) {
                return pathJoin(path, chrome.name);
            }
        }
    }
    return dir;
}

async function main() {
    const args = argParse(Deno.args);
    let { url, outDir, chromeDir } = args;
    if (!url) {
        console.error("No url provided.");
        Deno.exit(1);
    }
    outDir = outDir ?? "out.pdf";
    if(!chromeDir) {
        console.log("No chromeDir provided. Try to find chrome.");
        chromeDir = findChromeDir();
        console.log(`chromeDir: ${chromeDir}`);
    }

    const browser = await puppeteer.launch({
        product: "chrome",
        headless: true,
        executablePath: chromeDir,
    });

    const page = await browser.newPage();
    console.log(`goto url ${url}`);
    await page.goto(url, {
        waitUntil: "networkidle2",
      });
    await page.pdf({
        path: outDir,
        margin: {
            bottom: "1cm",
            left: "1cm",
            right: "1cm",
            top: "1cm",
        }
    });
    await browser.close();
}

if (import.meta.main) {
    main();
}