///|
/// Build a stable report for each requested period.
pub fn generate_many(
  kind : StatementKind,
  periods : Array[String],
  entries : Array[Entry],
  mappings : Array[AccountMapping],
) -> Array[Report] {
  let reports : Array[Report] = []
  for period in periods {
    reports.push(generate(kind, period, entries, mappings))
  }
  reports
}

///|
pub fn period_totals(reports : Array[Report]) -> Array[(String, Amount)] {
  let result : Array[(String, Amount)] = []
  for report in reports {
    result.push((report.period, report.total))
  }
  result
}

///|
pub fn period_delta(reports : Array[Report]) -> Array[Amount] {
  let result : Array[Amount] = []
  let mut previous = 0
  let mut first = true
  for report in reports {
    if first {
      result.push(0)
      first = false
    } else {
      result.push(report.total - previous)
    }
    previous = report.total
  }
  result
}

///|
pub fn latest_report(reports : Array[Report]) -> Report? {
  if reports.length() == 0 {
    return None
  }
  let mut latest = reports[0]
  for report in reports {
    if compare_period(report.period, latest.period) > 0 {
      latest = report
    }
  }
  Some(latest)
}

///|
pub fn lowest_report(reports : Array[Report]) -> Report? {
  if reports.length() == 0 {
    return None
  }
  let mut lowest = reports[0]
  for report in reports {
    if report.total < lowest.total {
      lowest = report
    }
  }
  Some(lowest)
}