// Streaming indicators with the Wickra Node binding.
//
// Feeds a synthetic price series through several indicators tick by tick —
// the same O(1)-per-update model a live trading bot would use — and prints a
// status line whenever every indicator has warmed up.
//
// Run it from the repository after building the native binding:
//
//   cd bindings/node && npm install && npx napi build --platform --release
//   cd ../../examples/node && npm install
//   node streaming.js

const wickra = require('wickra');

// A deterministic synthetic series: a slow trend with two oscillations and a
// little noise from a seeded generator (so every run prints the same thing).
function makeSeries(n) {
  let seed = 1234567;
  const rand = () => {
    seed = (seed * 1103515245 + 12345) & 0x7fffffff;
    return seed / 0x7fffffff;
  };
  const prices = [];
  for (let t = 0; t < n; t++) {
    const price =
      100 +
      t * 0.05 +
      Math.sin(t * 0.07) * 8 +
      Math.cos(t * 0.21) * 3 +
      (rand() - 0.5);
    prices.push(price);
  }
  return prices;
}

const fmt = (v) =>
  v === null || v === undefined || Number.isNaN(v) ? '  --  ' : v.toFixed(2);

function main() {
  console.log(`Wickra ${wickra.version()} — streaming indicator demo\n`);

  const sma = new wickra.SMA(20);
  const ema = new wickra.EMA(20);
  const rsi = new wickra.RSI(14);
  const macd = new wickra.MACD(12, 26, 9);

  const prices = makeSeries(120);
  let signals = 0;

  for (let t = 0; t < prices.length; t++) {
    const price = prices[t];
    const smaV = sma.update(price);
    const emaV = ema.update(price);
    const rsiV = rsi.update(price);
    const macdV = macd.update(price); // { macd, signal, histogram } or null

    // Only act once every indicator has produced a value.
    if (smaV == null || emaV == null || rsiV == null || macdV == null) {
      continue;
    }

    const overbought = rsiV > 70 && macdV.histogram < 0;
    const oversold = rsiV < 30 && macdV.histogram > 0;
    const tag = overbought ? 'SELL?' : oversold ? 'BUY? ' : '     ';
    if (overbought || oversold) signals++;

    console.log(
      `t=${String(t).padStart(3)}  price=${fmt(price)}  ` +
        `sma=${fmt(smaV)}  ema=${fmt(emaV)}  rsi=${fmt(rsiV)}  ` +
        `macd_hist=${fmt(macdV.histogram)}  ${tag}`,
    );
  }

  console.log(`\nDone — ${signals} candidate signal(s) over ${prices.length} ticks.`);
}

main();
