'use strict'
/*
  Open Rowing Monitor, https://github.com/laberning/openrowingmonitor

  This Averager calculates the average forecast for a moving interval of a continuous flow
  of data points for a certain (time) interval
*/
function createMovingIntervalAverager (movingDuration) {
  let dataPoints
  let duration
  let sum
  reset()

  function pushValue (dataValue, dataDuration) {
    // add the new data point to the front of the array
    dataPoints.unshift({ value: dataValue, duration: dataDuration })
    duration += dataDuration
    sum += dataValue
    while (duration > movingDuration) {
      const removedDataPoint = dataPoints.pop()
      duration -= removedDataPoint.duration
      sum -= removedDataPoint.value
    }
  }

  function getAverage () {
    if (duration > 0) {
      return sum / duration * movingDuration
    } else {
      return 0
    }
  }

  function reset () {
    dataPoints = []
    duration = 0.0
    sum = 0.0
  }

  return {
    pushValue,
    getAverage,
    reset
  }
}

export { createMovingIntervalAverager }
