import { expect } from "e2e";
import { test, WEB } from "./t3.ts";
import { T3_HOME } from "../e2e.config.ts";
import { readFileSync, writeFileSync } from "node:fs";
import { peer } from "./evidence-peer.ts";

test("Returning while a linked-environment request is pending lets it complete",WEB,async({t3,app,screen,browser})=>{
 await t3.project("demo");
 const file=`${T3_HOME}/userdata/settings.json`;
 writeFileSync(file,JSON.stringify({...JSON.parse(readFileSync(file,"utf8")),linkedEnvironmentsEnabled:true}));
 const remote=await peer(T3_HOME);
 try {
  remote.link();
  await browser.addInitScript(()=>{
   const Native=window.WebSocket;
   const proof={started:0,interrupted:0,forwarded:0,ids:[] as string[]};
   (window as any).__pendingProof=proof;
   window.WebSocket=class extends Native {
    send(data:any){
     let frames:any[]=[];try{const parsed=JSON.parse(String(data));frames=Array.isArray(parsed)?parsed:[parsed];}catch{}
     for(const frame of frames){if(frame._tag==="Interrupt"&&proof.ids.includes(String(frame.requestId)))proof.interrupted++;}
     if(frames.some(f=>f.tag==="peerLinks.list")){
      for(const f of frames.filter(f=>f.tag==="peerLinks.list")){proof.started++;proof.ids.push(String(f.id));}
      setTimeout(()=>{proof.forwarded++;super.send(data);},25000);
     }else super.send(data);
    }
   };
  });
  await t3.open("/settings/connections");
  await screen.getByRole("button","Environments",{exact:true}).tap();
  await app.screenshot("001-pending-list");
  await new Promise(r=>setTimeout(r,11000));
  await browser.evaluate(()=>{window.dispatchEvent(new Event("blur"));window.dispatchEvent(new Event("focus"));document.dispatchEvent(new Event("visibilitychange"));});
  await app.screenshot("002-return-while-request-pending");
  await expect(screen.getByText("Full access · Reachable",{exact:true})).toBeVisible({timeout:40000});
  await app.screenshot("003-original-request-completes");
  const proof=await browser.evaluate(()=>(window as any).__pendingProof);
  console.log("PENDING_REQUEST_TRANSCRIPT",JSON.stringify(proof));
  expect(proof).toMatchObject({started:1,interrupted:0,forwarded:1});
 }finally{await remote.stop();}
});
