///|
fn verdict(ok : Bool) -> String {
  if ok {
    "pass"
  } else {
    "fail"
  }
}

///|
fn main {
  println("moonsim: deterministic typed event simulation for MoonBit")
  println("kinds=Message,Task,Timer,StateTransition,ExternalCall")
  println("")

  let stream = @moonsim.event_stream()
  let sent = stream.record(
    @moonsim.message_event_kind(),
    0,
    "message.send",
    correlation_id="job-7",
    source="producer",
    target="worker",
  )
  ignore(
    stream.record(
      @moonsim.task_event_kind(),
      3,
      "task.complete",
      correlation_id="job-7",
      source="worker",
      target="result",
      parent_id=sent.id,
    ),
  )
  let fault_policy = @moonsim.event_mutation_policy(
    seed=2026UL,
    duplicate_percent=100,
  )
  let fault = stream.replay(fault_policy)
  let evidence = @moonsim.event_failure_case(
    "job_completed_once", stream, fault_policy,
  )
  let replay = evidence.replay()
  let fixed = stream.replay(@moonsim.event_mutation_policy(seed=evidence.seed))

  println("message/task fault reproduction")
  println("  seed=" + evidence.seed.to_string())
  println("  duplicated=" + fault.duplicated.to_string())
  println(
    "  invariant=" + verdict(fault.duplicated == 0) + " (expected finding)",
  )
  println("  digest=" + evidence.digest.to_string())
  println("same seed replay")
  println("  same_digest=" + verdict(fault.matches_digest(replay)))
  println("fixed policy regression")
  println("  invariant=" + verdict(fixed.duplicated == 0 && fixed.failed == 0))
  println("")

  let recording = @moonsim.retry_timeout_recording()
  let http_fault = recording.replay(
    policy=@moonsim.retry_timeout_fault_policy(),
  )
  let http_fixed = recording.replay(
    policy=@moonsim.retry_timeout_fixed_policy(),
  )
  println("ExternalCall adapter: recorded HTTP compatibility")
  println(
    "  fault_invariant=" +
    verdict(http_fault.invariants.passed()) +
    " (expected finding)",
  )
  println("  fixed_invariant=" + verdict(http_fixed.invariants.passed()))
  println("  showcase_exit=success")
}