import test from 'node:test';
import assert from 'node:assert/strict';
import {mkdtempSync, rmSync} from 'node:fs';
import {tmpdir} from 'node:os';
import {join} from 'node:path';
import {openControl, controlRequest, probeControl} from './control-socket.ts';

test('a session has one owner and an existing runtime receives input', async()=>{
  const directory=mkdtempSync(join(tmpdir(),'pi-control-'));
  process.env.DEVICE_LAB_CONTROL_DIR=directory;
  const received: string[]=[];
  let close: (()=>Promise<void>)|undefined;
  try {
    assert.equal(await probeControl('same-id'),null);
    close=await openControl('same-id',async request=>{
      if(request.method==='ping')return {session_id:'same-id',state:'IDLE'};
      received.push(request.text);return {accepted:true};
    });
    await assert.rejects(openControl('same-id',async()=>({})),{code:'EADDRINUSE'});
    assert.equal((await controlRequest('same-id',{method:'input',text:'continue'})).accepted,true);
    assert.deepEqual(received,['continue']);
    await close();close=undefined;
    assert.equal(await probeControl('same-id'),null);
    close=await openControl('same-id',async()=>({session_id:'same-id'}));
    assert.equal((await probeControl('same-id')).session_id,'same-id');
  } finally {if(close)await close();delete process.env.DEVICE_LAB_CONTROL_DIR;rmSync(directory,{recursive:true,force:true});}
});
