///|
fn benchmark_item(index : Int) -> @core.EvidenceItem {
  let content = "benchmark-evidence-" + index.to_string()
  @core.EvidenceItem::new(
    "BENCH-" + index.to_string(),
    index,
    "Benchmark evidence " + index.to_string(),
    "evidence/" + index.to_string() + ".pdf",
    @core.Category::PdfDocument,
    @digest.compute_string_digest(content),
    @core.SourceNote::default_note("benchmark"),
  )
}

///|
fn benchmark_batch(count : Int) -> @pipeline.EvidenceBatch {
  let items : Array[@core.EvidenceItem] = []
  for index = 1; index <= count; index = index + 1 {
    items.push(benchmark_item(index))
  }
  @pipeline.EvidenceBatch::from_items(items)
}

///|
fn run_benchmark(count : Int) -> String {
  let batch = benchmark_batch(count)
  let started = @env.now()
  let assessment = @pipeline.assess_batch(
    batch,
    @pipeline.BatchPolicy::strict(),
  )
  let elapsed = (@env.now() - started).reinterpret_as_int64()
  @pipeline.format_benchmark_line(
    count,
    elapsed,
    assessment.snapshot.canonical_bytes(),
    assessment.archive_ready(),
    assessment.snapshot.digest,
    assessment.verification.merkle_root,
  )
}

///|
fn main {
  println("MoonBit Notary benchmark")
  println(
    "items | elapsed_ms | items_per_second | canonical_bytes | archive_ready | snapshot | merkle",
  )
  println("--- | ---: | ---: | ---: | --- | --- | ---")
  for count in [100, 1000, 5000] {
    println(run_benchmark(count))
  }
}