// Screenshot helper for tuning: opens the pond in headless Chrome at a phone-ish
// viewport and writes a PNG. Usage:
//   node scripts/shot.mjs [url] [out] [width] [height] [waitMs]
import puppeteer from 'puppeteer';
import { mkdirSync } from 'node:fs';
import { dirname } from 'node:path';

const url = process.argv[2] || 'http://localhost:5173/';
const out = process.argv[3] || 'shot.png';
const width = Number(process.argv[4]) || 430;
const height = Number(process.argv[5]) || 932;
const waitMs = Number(process.argv[6]) || 5000;

const browser = await puppeteer.launch({
	headless: true,
	args: ['--enable-unsafe-swiftshader', '--hide-scrollbars'],
});

try {
	const page = await browser.newPage();
	await page.setViewport({ width, height, deviceScaleFactor: 2, isMobile: true, hasTouch: true });
	page.on('console', (msg) => console.log(`[console.${msg.type()}] ${msg.text()}`));
	page.on('pageerror', (err) => console.log(`[pageerror] ${err.message}`));
	page.on('requestfailed', (req) => console.log(`[requestfailed] ${req.url()} ${req.failure()?.errorText || ''}`));

	await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
	await new Promise((r) => setTimeout(r, waitMs));
	// optional JS to run before the shot, e.g. to pose the camera or season
	const js = process.argv[7];
	if (js) {
		await page.evaluate(js);
		await new Promise((r) => setTimeout(r, 1200));
	}
	mkdirSync(dirname(out), { recursive: true });
	await page.screenshot({ path: out });
	console.log(`saved ${out}`);
} finally {
	await browser.close();
}