import http from 'node:http';
import {fileURLToPath} from 'node:url';
import {resolve} from 'node:path';
import {makePool} from './pool.mjs';
import {compute} from './worker.mjs';
export async function startServer({port=Number(process.env.PORT||8310),threads=2,maxQueue=8}={}){
 const pool=makePool({threads,maxQueue});await pool.run({rounds:10});let closing=false,active=0,completed=0;
 const send=(res,status,body)=>{res.writeHead(status,{'Content-Type':'application/json','Cache-Control':'no-store'});res.end(JSON.stringify(body));};
 const server=http.createServer(async(req,res)=>{
  const u=new URL(req.url,'http://localhost');
  if(req.method!=='GET'){send(res,405,{error:'GET_ONLY'});return;}
  if(u.pathname==='/health'){send(res,closing?503:200,{ok:!closing,active,queued:pool.queueSize,completed});return;}
  if(u.pathname!=='/compute'){send(res,404,{error:'NOT_FOUND'});return;}
  if(closing){send(res,503,{error:'SHUTTING_DOWN'});return;}
  const rounds=Number(u.searchParams.get('rounds')||10000000),mode=u.searchParams.get('mode')||'pool';
  if(!Number.isSafeInteger(rounds)||rounds<1||rounds>100000000||!['main','pool'].includes(mode)){send(res,400,{error:'INVALID_INPUT'});return;}
  if(active>=threads+maxQueue){send(res,503,{error:'BUSY_RETRY_LATER'});return;}
  active++;const abort=new AbortController();res.once('close',()=>{if(!res.writableEnded)abort.abort();});
  try{const result=mode==='main'?compute({rounds}):await pool.run({rounds},{signal:abort.signal});completed++;if(!res.destroyed)send(res,200,{mode,result});}
  catch(e){if(!res.destroyed)send(res,503,{error:e.name==='AbortError'?'CANCELLED':'TASK_FAILED'});}
  finally{active--;}
 });
 await new Promise((resolve,reject)=>{server.once('error',reject);server.listen(port,'127.0.0.1',resolve);});
 return {server,pool,port:server.address().port,close:async()=>{closing=true;const stopped=new Promise(r=>server.close(r));await stopped;await pool.close();}};
}
if(process.argv[1]&&resolve(process.argv[1])===fileURLToPath(import.meta.url)){
 const app=await startServer();console.log(JSON.stringify({ready:true,port:app.port,pid:process.pid}));
 let stopping=false;const stop=async()=>{if(stopping)return;stopping=true;await app.close();process.exit(0);};process.on('SIGINT',stop);process.on('SIGTERM',stop);process.on('message',m=>{if(m==='stop')stop();});
}
