///|
/// Wasm/package-facing helpers for M5-NATIVE-WASM-DIFF.

///|
pub fn package_id() -> String {
  "lockwire/wasm"
}

///|
pub(all) struct DiffFingerprint {
  scenario : String
  seed : Int
  digest : @core.SimDigest
} derive(Eq, Debug)

///|
pub fn p2p_trace_log(
  seed~ : Int,
  backend~ : @core.BackendProfile,
) -> @trace.TraceLog {
  @sim.run_p2p_demo(seed~).to_trace_log(backend~)
}

///|
pub fn p2p_fingerprint(
  seed~ : Int,
  backend~ : @core.BackendProfile,
) -> DiffFingerprint {
  {
    scenario: "p2p",
    seed,
    digest: p2p_trace_log(seed~, backend~).portable_digest(seed~),
  }
}

///|
pub fn p2p_native_wasm_match(seed~ : Int) -> Bool {
  p2p_fingerprint(seed~, backend=@core.SimNative).digest ==
  p2p_fingerprint(seed~, backend=@core.SimWasm).digest
}

///|
pub fn p2p_digest_line(seed~ : Int) -> String {
  let fingerprint = p2p_fingerprint(seed~, backend=@core.SimNative)
  "scenario=" +
  fingerprint.scenario +
  "|seed=" +
  fingerprint.seed.to_string() +
  "|trace_digest=" +
  fingerprint.digest.state_digest.to_string() +
  "|rng_steps=" +
  fingerprint.digest.rng_steps.to_string() +
  "|event_count=" +
  fingerprint.digest.event_count.to_string()
}

///|
pub fn p2p_benchmark_report(
  seed~ : Int,
  backend~ : @core.BackendProfile,
) -> @trace.RuntimeBenchmarkReport {
  @sim.p2p_benchmark_report(seed~, backend~)
}

///|
pub fn p2p_native_wasm_benchmark_match(seed~ : Int) -> Bool {
  let native = p2p_benchmark_report(seed~, backend=@core.SimNative)
  let wasm = p2p_benchmark_report(seed~, backend=@core.SimWasm)
  native.digest == wasm.digest &&
  native.metric_value("events/run") == wasm.metric_value("events/run") &&
  native.metric_value("trace-bytes/run") == wasm.metric_value("trace-bytes/run")
}

///|
pub fn p2p_benchmark_line(seed~ : Int) -> String {
  p2p_benchmark_report(seed~, backend=@core.SimNative).to_text()
}