#!/usr/bin/env node

import puppeteer from "puppeteer-core";

const code = process.argv.slice(2).join(" ");
if (!code) {
  console.log("Usage: browser-eval.js 'code'");
  console.log("\nExamples:");
  console.log('  browser-eval.js "document.title"');
  console.log('  browser-eval.js "document.querySelectorAll(\'a\').length"');
  process.exit(1);
}

const b = await Promise.race([
  puppeteer.connect({
    browserURL: "http://localhost:9222",
    defaultViewport: null,
  }),
  new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), 5000)),
]).catch((e) => {
  console.error("✗ Could not connect to browser:", e.message);
  console.error("  Run: browser-start.js");
  process.exit(1);
});

const p = (await b.pages()).at(-1);

if (!p) {
  console.error("✗ No active tab found");
  process.exit(1);
}

const result = await p.evaluate((c) => {
  const AsyncFunction = (async() => {}).constructor;
  return new AsyncFunction(`return (${c})`)();
}, code);

if (Array.isArray(result)) {
  for (let i = 0; i < result.length; i++) {
    if (i > 0) {console.log("");}
    for (const [key, value] of Object.entries(result[i])) {
      console.log(`${key}: ${value}`);
    }
  }
} else if (typeof result === "object" && result !== null) {
  for (const [key, value] of Object.entries(result)) {
    console.log(`${key}: ${value}`);
  }
} else {
  console.log(result);
}

await b.disconnect();
