// True-mode browser action core. Drives the on-screen Chrome (CDP at CDP_PORT,
// default 9222) so the action is visible on the Go-Live broadcast, and prints a
// JSON result on stdout for the Python `browseAndSearch` tool to wrap.
//
//   node browse-search.mjs "<query>" [search|youtube]
//
// - search  : Google-search the query, return the top organic results.
// - youtube : search YouTube and play the first result.
import { chromium } from 'playwright';

const CDP = process.env.CDP_PORT || '9222';
// Use 127.0.0.1, not "localhost": in containers localhost can resolve to IPv6
// (::1) first while Chrome's CDP listens on IPv4, giving ECONNREFUSED ::1.
const CDP_HOST = process.env.CDP_HOST || '127.0.0.1';
const query = process.argv[2] || '';
const mode = (process.argv[3] || 'search').toLowerCase();
const out = (o) => { process.stdout.write(JSON.stringify(o)); };

if (!query) { out({ ok: false, error: 'no query' }); process.exit(1); }

let b;
try {
  b = await chromium.connectOverCDP(`http://${CDP_HOST}:${CDP}`);
  const ctx = b.contexts()[0];
  const page = ctx.pages()[0] || (await ctx.newPage());
  page.setDefaultTimeout(20000);
  await page.bringToFront().catch(() => {});

  if (mode === 'youtube') {
    await page.goto(`https://www.youtube.com/results?search_query=${encodeURIComponent(query)}`, { waitUntil: 'domcontentloaded' });
    await page.waitForSelector('ytd-video-renderer a#video-title, a#video-title', { timeout: 20000 });
    const first = page.locator('ytd-video-renderer a#video-title, a#video-title').first();
    const title = (await first.getAttribute('title').catch(() => '')) || (await first.innerText().catch(() => ''));
    await first.click();
    await page.waitForSelector('#movie_player', { timeout: 20000 });
    await page.evaluate(() => { const v = document.querySelector('video'); if (v && v.paused) v.play(); });
    out({ ok: true, mode, title: (title || '').trim(), url: page.url() });
  } else {
    await page.goto(`https://www.google.com/search?q=${encodeURIComponent(query)}&hl=ko`, { waitUntil: 'domcontentloaded' });
    await page.waitForTimeout(1500);
    const results = await page.evaluate(() => {
      const seen = new Set();
      const items = [];
      for (const h of Array.from(document.querySelectorAll('a h3'))) {
        const a = h.closest('a');
        const url = a?.href || '';
        if (!url || seen.has(url) || url.includes('google.com')) continue;
        const block = h.closest('div[data-hveid], div.g') || a.parentElement;
        let snippet = '';
        const sn = block?.querySelector('div[data-sncf], div[style*="webkit-line-clamp"], .VwiC3b');
        snippet = (sn?.innerText || '').trim();
        seen.add(url);
        items.push({ title: h.innerText.trim(), url, snippet });
        if (items.length >= 6) break;
      }
      return items;
    });
    out({ ok: true, mode, query, count: results.length, results });
  }
  await b.close();
} catch (e) {
  try { await b?.close(); } catch { /* ignore */ }
  out({ ok: false, error: String(e?.message || e) });
  process.exit(1);
}
