import { expect } from "e2e";
import { writeFileSync, existsSync, unlinkSync } from "node:fs";
import { setTimeout as delay } from "node:timers/promises";
import { test, WEB, makeState, runPromise } from "./t3.ts";
import { T3_HOME } from "../e2e.config.ts";

test("Unconfirmed Codex Stop offers Force stop and late completion settles it", WEB, async ({t3,app,screen}) => {
  const dir=process.env.STOP_FIXTURE_DIR!;
  for(const name of ['release','interrupted']) if(existsSync(`${dir}/${name}`)) unlinkSync(`${dir}/${name}`);
  const project=await t3.project('stop-demo');
  const {cli}=makeState(T3_HOME);
  const result=await runPromise(cli(['thread','start',project,'Warmup','--title','Codex Stop demonstration','--provider','codex','--model','gpt-5.4','--wait','--json']));
  const thread=JSON.parse(result.stdout);
  console.log('SEEDED', thread);
  await t3.open(thread);
  console.log('OPENED');
  await screen.getByRole('textbox').fill('Run a controlled turn; withhold completion until released.');
  await screen.getByRole('textbox').press('Enter');
  console.log('SENT');
  await screen.getByText('Controlled Codex turn is running. Completion is withheld until released.',{exact:false}).waitFor({state:'visible'});
  await screen.getByRole('button','Stop generation').tap();
  console.log('STOPPED');
  await delay(12500);
  await app.screenshot('stop-after-timeout');
  let failure;
  try { await expect(screen.getByRole('button','Force stop',{exact:true})).toBeVisible({timeout:1000}); }
  catch(e) { failure=e; }
  writeFileSync(`${dir}/release`,'complete');
  await delay(2500);
  await app.screenshot('late-completion');
  if(failure) throw failure;
  await expect(screen.getByRole('button','Force stop',{exact:true})).toBeHidden();
  await expect(screen.getByText('Run interrupted',{exact:true})).toBeVisible();
});
