import { rename, mkdir, cp, readFile, writeFile } from 'node:fs/promises';
import { test, WEB, makeState, runPromise } from './t3.ts';
import { T3_HOME } from '../e2e.config.ts';

test('Missing project folder and restored-folder terminal recovery', WEB, async ({ t3, app, screen, browser }) => {
  const seeded = await t3.project('terminal-recovery');
  const parent = '/tmp/factory-pr-23251-evidence-3/demo';
  await mkdir(parent, { recursive: true });
  const project = `${parent}/terminal-recovery`;
  await cp(seeded, project, { recursive: true });
  const { cli } = makeState(T3_HOME);
  await runPromise(cli(['project', 'add', project, '--title', 'Terminal recovery']));
  await t3.thread({ project, title: 'Folder recovery', messages: ['Start'] });
  await browser.emulateMedia({ reducedMotion: 'reduce', colorScheme: 'light' });
  await t3.open();
  const side = process.env.EVIDENCE_SIDE ?? 'unknown';
  const stable = async (label: string) => {
    let previous = await app.screenshot(`${label}-settling`);
    for (let n = 0; n < 10; n++) {
      await browser.evaluate(() => new Promise(resolve => setTimeout(resolve, 500)));
      const current = await app.screenshot(`${label}-stable`);
      if ((await readFile(previous)).equals(await readFile(current))) {
        await cp(current, `/tmp/factory-pr-23251-evidence-3/${side}-${label}.png`);
        return;
      }
      previous = current;
    }
    throw new Error(`The ${label} view did not settle`);
  };
  const terminalText = async () => {
    await browser.locator('[data-thread-terminal-drawer] canvas').last().tap();
    await browser.keyboard.press('Control+Shift+A');
    await browser.keyboard.press('Control+Shift+C');
    return browser.evaluate(() => (document.querySelector('textarea[aria-label="Terminal input"]') as HTMLTextAreaElement).value);
  };
  await screen.getByRole('button', 'Folder recovery, Done, Terminal recovery').tap();
  await screen.getByRole('button', 'Publish repository').waitFor({ state: 'visible' });
  await screen.getByRole('button', 'Toggle thread details panel').tap();
  await rename(project, `${project}-moved`);
  let missing = '';
  try {
    await screen.getByRole('button', 'Toggle terminal drawer').tap();
    await screen.getByRole('textbox', 'Terminal input').waitFor({ state: 'attached' });
    await browser.evaluate(() => new Promise(resolve => setTimeout(resolve, 2000)));
    await stable('missing-folder');
    missing = await terminalText();
  } finally {
    await rename(`${project}-moved`, project);
  }
  await screen.getByRole('button', /^New Terminal/).tap();
  await browser.locator('[data-thread-terminal-drawer] canvas').last().tap();
  await browser.keyboard.type("printf 'RECOVERED\\n'");
  await browser.keyboard.press('Enter');
  await browser.evaluate(() => new Promise(resolve => setTimeout(resolve, 2000)));
  await screen.getByRole('button', 'Toggle thread details panel').tap();
  await screen.getByRole('button', 'Publish repository').waitFor({ state: 'visible' });
  await stable('recovered');
  const recovered = await terminalText();
  await writeFile(`/tmp/factory-pr-23251-evidence-3/${side}-observations.json`, JSON.stringify({ missing, guidance: missing.includes('Restore the folder at this path before retrying.'), recovered }, null, 2));
});
