#!/usr/bin/env node
'use strict';
// P50X bring-up / diagnose-tool voor de Twin Center.
// Gebruikt exact dezelfde adapter als de app, dus je test het echte commando-pad.
//
// Zonder hardware (geen serialport): "dry-run" — toont alleen de bytes die verstuurd zouden worden.
// Met hardware op de Pi (na `npm i serialport`): stuurt echt + dumpt de antwoorden (hex).
//
// Voorbeelden:
//   node tools/p50x-test.js --port /dev/ttyUSB0 --baud 19200 power on
//   node tools/p50x-test.js drive 3 60 fwd      # loc 3, snelheid 60, vooruit
//   node tools/p50x-test.js func 3 0 on         # loc 3, F0 (licht) aan
//   node tools/p50x-test.js turnout 1 thrown    # wissel 1 afbuigend
//   node tools/p50x-test.js estop               # noodstop (XHalt)
//   node tools/p50x-test.js sensors             # XSensOff + luister 8s naar terugmelding
//   node tools/p50x-test.js listen 12           # luister 12s, dump alle bytes
//   node tools/p50x-test.js raw 78 a7           # stuur willekeurige bytes
const { TwinCenter } = require('../lib/twincenter');

const argv = process.argv.slice(2);
let port, baud;
const rest = [];
for (let i = 0; i < argv.length; i++) {
  if (argv[i] === '--port') port = argv[++i];
  else if (argv[i] === '--baud') baud = parseInt(argv[++i], 10);
  else rest.push(argv[i]);
}
const [cmd, ...a] = rest;

const tc = new TwinCenter({ path: port, baud });
tc.on('log', (l) => console.log(l));
tc.on('open', () => console.log('[verbonden]'));
tc.on('close', () => console.log('[geen verbinding — dry-run, alleen bytes getoond]'));

tc.connect();

function dir(s) { return /^(v|f|vooruit|fwd|1)/i.test(s || '') ? 1 : 0; }
function on(s) { return /^(1|on|aan|true|thrown|afbuigend)/i.test(s || '') ? 1 : 0; }

setTimeout(() => {
  switch (cmd) {
    case 'power':   tc.power(on(a[0])); break;
    case 'drive':   tc.throttle(parseInt(a[0], 10), parseInt(a[1], 10), dir(a[2])); break;
    case 'func':    tc.func(parseInt(a[0], 10), parseInt(a[1], 10), on(a[2])); break;
    case 'turnout': tc.turnout(parseInt(a[0], 10), on(a[1])); break;
    case 'estop':   tc.estop(); break;
    case 'sensors': tc._raw([0x99]); console.log('[XSensOff verstuurd — luister 8s naar XEvtSen…]'); break;
    case 'listen':  console.log('[luister ' + (a[0] || 8) + 's…]'); break;
    case 'raw':     tc._raw(a.map((h) => parseInt(h.replace(/^0x/, ''), 16)).filter((n) => !isNaN(n)).slice(1)); break;
    default:
      console.log('Onbekend commando. Zie de voorbeelden bovenaan dit bestand.');
      process.exit(0);
  }
  // tijd om antwoorden van de centrale op te vangen
  const wait = cmd === 'listen' ? (parseInt(a[0], 10) || 8) * 1000 : (cmd === 'sensors' ? 8000 : 1500);
  setTimeout(() => process.exit(0), wait);
}, 400);
