///|
fn run_workload(key_count : Int) -> Unit {
  let engine = @txn.Engine::new()
  let seed = engine.begin()
  for index = 0; index < key_count; index = index + 1 {
    ignore(seed.put("inventory:item-\{index}", "available"))
  }
  let seed_result = seed.commit()

  let scanner = engine.begin(isolation=@txn.IsolationLevel::Serializable)
  let rows = scanner.scan_prefix("inventory:")
  let first_key = if rows.length() > 0 { rows[0].key } else { "" }
  let last_key = if rows.length() > 0 {
    rows[rows.length() - 1].key
  } else {
    ""
  }

  let writer = engine.begin()
  ignore(writer.put("inventory:new-item", "available"))
  let writer_result = writer.commit()
  ignore(scanner.put("audit:inventory", "scanned"))
  let scanner_result = scanner.commit()

  let wal = engine.wal()
  let (recovered, recovery) = @txn.Engine::recover(wal)
  println(
    "workload keys=\{key_count} rows=\{rows.length()} first=\{first_key} last=\{last_key} seed=\{seed_result.to_json()} writer=\{writer_result.to_json()} scanner=\{scanner_result.to_json()} wal_records=\{wal.length()} recovery=\{recovery.to_json()} recovered_keys=\{recovered.stats().keys} validation_issues=\{recovered.validate().length()}",
  )
}

///|
fn main {
  // The values are portable operation counts; record timing externally with
  // the exact MoonBit backend, hardware, and command line.
  for key_count in [1000, 10000, 100000] {
    run_workload(key_count)
  }
}