// ASCII table summary of scenario samples.
// Used by simulations/run.js.

function pad(s, n, left = false) {
  s = String(s ?? '');
  if (s.length >= n) return s.slice(0, n);
  return left ? s.padStart(n) : s.padEnd(n);
}

function num(x, digits = 2) {
  return Number.isFinite(x) ? x.toFixed(digits) : '—';
}

function formatTable(records, sampleEvery = 1) {
  if (!records.length) return '  (no records)';
  const header = ['t(s)', 'level(m)', 'vol(m3)', 'dir', 'netFlow(m3/s)', 'src', 'demand', 'safe'];
  const rows = [];
  for (let i = 0; i < records.length; i += sampleEvery) rows.push(records[i]);
  if (rows[rows.length - 1] !== records[records.length - 1]) rows.push(records[records.length - 1]);

  const widths = [6, 9, 9, 10, 14, 14, 8, 5];
  const lines = [];
  lines.push(header.map((h, i) => pad(h, widths[i], true)).join('  '));
  lines.push(widths.map((w) => '─'.repeat(w)).join('  '));
  for (const r of rows) {
    lines.push([
      pad(r.t, widths[0], true),
      pad(num(r.level, 2), widths[1], true),
      pad(num(r.volume, 2), widths[2], true),
      pad(r.direction ?? '—', widths[3], true),
      pad(num(r.netFlow, 5), widths[4], true),
      pad(r.flowSource ?? '—', widths[5], true),
      pad(num(r.percControl, 0) + '%', widths[6], true),
      pad(r.safetyActive ? '⚠' : '·', widths[7], true),
    ].join('  '));
  }
  return lines.map((l) => '  ' + l).join('\n');
}

module.exports = { formatTable };
