// Copyright 2026 MoonBit DSP Authors
// Apache-2.0 License

///|
fn main {
  println(
    "=== MoonBit DSP: Industrial Machine Vibration Condition Monitoring Demo ===",
  )

  let fs = 1000.0
  let n = 256
  let accel = Array::make(n, 0.0)

  // Normal rotation baseline + bearing fault impact spike train
  for i = 0; i < n; i = i + 1 {
    let t = i.to_double() / fs
    let baseline = 0.5 * @cmath.sin(2.0 * @cmath.PI * 25.0 * t) // 25 Hz shaft rotation
    let impact = if i % 40 == 0 { 8.5 } else { 0.0 } // 25 Hz * (1000/40) = bearing impact
    accel[i] = baseline + impact
  }

  let indicators = @vibration_dsp.compute_vibration_indicators(accel)
  println("Peak Acceleration: \{indicators.peak_value} m/s^2")
  println("RMS Acceleration:  \{indicators.rms_value} m/s^2")
  println("Crest Factor:      \{indicators.crest_factor}")
  println("Kurtosis:          \{indicators.kurtosis}")

  let envelope_spec = @vibration_dsp.bearing_envelope_spectrum(accel)
  println(
    "Computed bearing envelope spectrum length: \{envelope_spec.length()}",
  )

  let analyzer = @streaming.FrameAnalyzer::new(
    128,
    64,
    fs,
    @window.WindowType::hann(),
  )
  let mut frame_count = 0
  for i = 0; i < n; i = i + 1 {
    match analyzer.push(accel[i]) {
      Some(features) => {
        frame_count = frame_count + 1
        println(
          "Frame \{frame_count}: dominant frequency \{features.dominant_frequency()} Hz, spectral centroid \{features.spectral_centroid()} Hz",
        )
      }
      None => ()
    }
  }
}