///|
pub fn export_bundle(case : BenchmarkCase, cutoffs~ : Array[Int]) -> String {
  let result = run_benchmark_case(case, cutoffs~)
  let manifest = render_benchmark_manifest(case)
  let qrels = render_qrels_tsv(case.qrels)
  let run = render_run_tsv(case.run)
  let builder = StringBuilder()
  builder.write_string("manifest\n========\n\{manifest}\n\n")
  builder.write_string("report\n======\n\{render_benchmark_result(result)}\n\n")
  builder.write_string("qrels.tsv\n=========\n\{qrels}\n\n")
  builder.write_string("run.tsv\n=======\n\{run}\n")
  builder.to_string()
}

///|
pub fn export_bundle_json(
  case : BenchmarkCase,
  cutoffs~ : Array[Int],
) -> String {
  let result = run_benchmark_case(case, cutoffs~)
  let manifest = render_benchmark_manifest(case)
  let escaped = manifest.replace_all(old="\"", new="\\\"")
  "{\"manifest\":\"\{escaped}\",\"result\":\{ToJson::to_json(result).stringify()}}"
}

///|
pub fn export_report_files(report : BenchmarkReport) -> Map[String, String] {
  let files : Map[String, String] = Map([])
  files["report.md"] = render_markdown_report(report)
  files["report.csv"] = render_csv_report(report)
  files["report.json"] = render_json_report(report)
  files["report.jsonl"] = render_json_lines_report(report)
  files["report.html"] = render_html_report(report)
  files
}

///|
pub fn export_report_index(report : BenchmarkReport) -> String {
  let files = export_report_files(report)
  let rows : Array[String] = ["# MoonRAGBench exports", ""]
  for name, content in files {
    rows.push("- '\{name}': \{content.length()} bytes")
  }
  rows.join("\n")
}

///|
pub fn bundle_is_reproducible(
  case : BenchmarkCase,
  cutoffs~ : Array[Int],
) -> Bool {
  export_bundle(case, cutoffs~) == export_bundle(case, cutoffs~)
}