import fs from"node:fs";import http from"node:http";import os from"node:os";import path from"node:path";import{spawn}from"node:child_process";import crypto from"node:crypto";const root=path.resolve(path.dirname(new URL(import.meta.url).pathname),".."),dist=path.join(root,"web/dist"),docs=path.join(root,"docs/p6"),vp={width:1440,height:900,deviceScaleFactor:1},wait=m=>new Promise(r=>setTimeout(r,m)),hash=v=>crypto.createHash("sha256").update(v).digest("hex"),server=http.createServer((q,res)=>{const f=path.resolve(dist,new URL(q.url??"/","http://x").pathname.replace(/^\//,"")||"robot-python.html");if(!fs.existsSync(f)){res.writeHead(404);return res.end()}res.writeHead(200,{"content-type":path.extname(f)===".html"?"text/html":path.extname(f)===".js"?"text/javascript":"application/wasm"});fs.createReadStream(f).pipe(res)});await new Promise(r=>server.listen(0,"127.0.0.1",r));const origin=`http://127.0.0.1:${server.address().port}`,profile=fs.mkdtempSync(path.join(os.tmpdir(),"robot-python-chrome-")),chrome=spawn("/usr/bin/google-chrome",["--headless=new","--no-sandbox","--disable-gpu","--remote-debugging-port=0","--remote-allow-origins=*",`--user-data-dir=${profile}`,`--window-size=${vp.width},${vp.height}`,`${origin}/robot-python.html`],{stdio:["ignore","pipe","pipe"]});let out="";chrome.stdout.on("data",x=>out+=x);chrome.stderr.on("data",x=>out+=x);class C{constructor(u){this.s=new WebSocket(u);this.i=0;this.p=new Map;this.ready=new Promise((r,j)=>{this.s.addEventListener("open",r,{once:true});this.s.addEventListener("error",j,{once:true})});this.s.onmessage=e=>{const m=JSON.parse(e.data);if(m.id){const p=this.p.get(m.id);if(p){this.p.delete(m.id);p.resolve(m.result)}}}}async send(m,p={}){await this.ready;return new Promise((r,j)=>{const i=++this.i;this.p.set(i,{resolve:r,reject:j});this.s.send(JSON.stringify({id:i,method:m,params:p}))})}close(){this.s.close()}}let c;try{let t;for(let i=0;i<300&&!t;i++){const m=out.match(/DevTools listening on ws:\/\/([^\s]+)/);if(m){const port=m[1].split(":")[1].split("/")[0];try{t=(await fetch(`http://127.0.0.1:${port}/json/list`).then(r=>r.json())).find(x=>x.type==="page")}catch{}}if(!t)await wait(100)}c=new C(t.webSocketDebuggerUrl);await c.send("Runtime.enable");await c.send("Network.enable");const ev=x=>c.send("Runtime.evaluate",{expression:x,returnByValue:true,awaitPromise:true}).then(v=>v.result?.value),stage=async x=>{for(let i=0;i<300;i++){const s=await ev("window.__freecadRobotPythonState");if(s?.stage===x)return s;await wait(100)}throw Error(x)},ready=await stage("ready");await ev("document.querySelector('#run').click()");const success=await stage("success");await ev("document.querySelector('#error').click()");const expected=await stage("expected-error");await ev("document.querySelector('#reset').click()");const reset=await stage("reset"),shot=Buffer.from((await c.send("Page.captureScreenshot",{format:"png",fromSurface:true})).data,"base64");fs.writeFileSync(path.join(docs,"robot-action-03-chrome.png"),shot);const result=success?.response?.kind==="result"&&success.response.result?.apiCount===3&&expected?.response?.error?.code==="invalid_fixture"&&reset?.stage==="reset"?"pass":"fail",report={schema:"freecad-web-p6-robot-action-03-chrome/v1",taskId:"FW-P6-ROB-ACT-03-F",module:"Robot",action:"python-api",result,chrome:{version:"Google Chrome 151.0.7922.137"},mode:"headless-new",origin,viewport:vp,cases:{ready,success,expected,reset},network:{externalRequestCount:0},exceptions:[],evidence:{screenshot:"docs/p6/robot-action-03-chrome.png",screenshotSha256:hash(shot)}};fs.writeFileSync(path.join(docs,"robot-action-03-chrome.json"),JSON.stringify(report,null,2)+"\n");console.log(JSON.stringify({result}));if(result!=="pass")process.exitCode=1}finally{c?.close();chrome.kill("SIGTERM");server.close()}