///|
/// Deterministic fixture generation keeps benchmark comparisons meaningful.
pub struct BenchmarkResult {
  entries : Int
  mappings : Int
  lines : Int
  total : Amount
  elapsed_ms : Int
} derive(Debug, Eq)

///|
pub fn benchmark_fixture(size : Int) -> (Array[Entry], Array[AccountMapping]) {
  let entries : Array[Entry] = []
  let mappings : Array[AccountMapping] = []
  let count = if size < 0 { 0 } else { size }
  for i in 0.. BenchmarkResult {
  let started = @env.now()
  let (entries, mappings) = benchmark_fixture(size)
  let report = generate(IncomeStatement, "2026-Q2", entries, mappings)
  let elapsed_ms = (@env.now() - started).to_int()
  {
    entries: entries.length(),
    mappings: mappings.length(),
    lines: report.lines.length(),
    total: report.total,
    elapsed_ms,
  }
}

///|
pub fn benchmark_summary(result : BenchmarkResult) -> String {
  "entries=" +
  result.entries.to_string() +
  " mappings=" +
  result.mappings.to_string() +
  " lines=" +
  result.lines.to_string() +
  " total=" +
  result.total.to_string() +
  " elapsed_ms=" +
  result.elapsed_ms.to_string()
}