import puppeteer from 'puppeteer-core';
import { spawn } from 'node:child_process';
import net from 'node:net';
const preview = spawn('npx', ['vite','preview','--host','127.0.0.1','--port','4815','--strictPort'], { stdio:'ignore' });
process.on('exit', () => { try{preview.kill()}catch{} });
for (let i=0;i<50;i++){ const ok = await new Promise(r=>{const s=net.connect(4815,'127.0.0.1');s.once('connect',()=>{s.end();r(true)});s.once('error',()=>r(false))}); if(ok)break; await new Promise(r=>setTimeout(r,300)); }
const browser = await puppeteer.launch({ executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', headless: true, args: ['--autoplay-policy=no-user-gesture-required','--mute-audio'] });
const page = await browser.newPage();
await page.setViewport({ width: 960, height: 560 });
page.on('pageerror', e => console.log('[pageerror]', (e.stack||e.message).slice(0,600)));
await page.goto('http://127.0.0.1:4815/', { waitUntil: 'networkidle2' });
await page.waitForFunction('window.__game && window.__director', { timeout: 20000 });
await page.waitForFunction(() => window.__game.scene.isActive('TitleScene'), { timeout: 20000 });
await page.evaluate(() => { document.querySelector('#game input[type="text"]').closest('div').querySelector('button').click(); });
await page.waitForFunction(() => window.__game.scene.isActive('HouseScene'), { timeout: 15000 });
const sleep = (ms) => new Promise(r=>setTimeout(r,ms));
const tap = async (code, hold=90) => { await page.keyboard.down(code); await sleep(hold); await page.keyboard.up(code); await sleep(30); };
await sleep(500);
// 设定 D2 + 已取信
await page.evaluate(() => {
  const d = window.__director;
  d.setDay(2);
  d.taskProgress['letters'] = 3;
  const sm = window.__game.scene;
  for (const sc of sm.getScenes(true)) { const k = sc.scene.key; if (k !== 'UIScene' && k !== 'BakeryScene') sm.stop(k); }
  sm.start('BakeryScene', { spawn: 'default' });
});
await page.waitForFunction(() => window.__game.scene.isActive('BakeryScene'), { timeout: 9000 });
await sleep(600);
const dump1 = await page.evaluate(() => {
  const s = window.__game.scene.getScene('BakeryScene');
  return {
    day: window.__director.day,
    letters: window.__director.taskProgress['letters'],
    t4active: window.__director.isTaskActive('T4'),
    actors: s.actors.map(a => ({ id: a.def.id, x: Math.round(a.sprite.x), y: Math.round(a.sprite.y) })),
    player: { x: s.player.x, y: s.player.y },
  };
});
console.log('dump1', JSON.stringify(dump1));
// 传送到圆圆旁（actor 实际坐标）
await page.evaluate(() => {
  const s = window.__game.scene.getScene('BakeryScene');
  const a = s.actors.find(a => a.def.id === 'yuanyuan');
  s.player.setPosition(a.sprite.x, a.sprite.y); s.player.setVelocity(0,0);
});
await sleep(200);
await tap('KeyE');
await sleep(500);
const dump2 = await page.evaluate(() => {
  const u = window.__game.scene.getScene('UIScene');
  return {
    dialogueActive: window.__director.dialogueActive,
    payload: u.payload ? u.payload.lines : null,
    lettersTo: window.__director.taskSetProgress['lettersTo'] ? [...window.__director.taskSetProgress['lettersTo']] : null,
    tasksDone: [...window.__director.tasksDone],
  };
});
console.log('dump2', JSON.stringify(dump2, null, 1));
await browser.close();
