///|
fn usage() -> String {
  let text =
    #|MoonFlowGraph snapshot audit CLI
    #|
    #|Usage:
    #|  moon run cmd/audit -- --json ''
    #|  moon run cmd/audit -- --help
    #|
    #|The command parses and audits a run-snapshot-v1 artifact. It validates
    #|the graph, serialized plan, trace references, lifecycle events, and task
    #|status consistency without executing any workflow task.
    #|
  text
}

///|
fn parse_input_arg(args : Array[String]) -> Result[String?, String] {
  if args.length() <= 1 {
    return Err("missing --json input")
  }
  let first = args[1]
  if first == "--help" || first == "-h" {
    return Ok(Some("__help__"))
  }
  if first == "--json" {
    if args.length() < 3 {
      return Err("missing value after --json")
    }
    if args.length() > 3 {
      return Err("unexpected extra arguments after --json")
    }
    return Ok(Some(args[2]))
  }
  Err("unknown argument: \{first}")
}

///|
fn render_audit_report(snapshot : @moonflowgraph.RunSnapshot) -> String {
  let graph = snapshot.graph()
  let plan = snapshot.plan()
  let trace = snapshot.trace()
  let out = StringBuilder()
  out <+ "# MoonFlowGraph Snapshot Audit\n\n"
  out <+ "- Schema version: 1\n"
  out <+ "- Tasks: \{graph.task_count()}\n"
  out <+ "- Dependencies: \{graph.dependency_count()}\n"
  out <+ "- Execution batches: \{plan.batches().length()}\n"
  out <+ "- Trace events: \{trace.event_count()}\n"
  out <+ "- Audit: valid\n"
  out.to_string()
}

///|
fn main {
  let input = match parse_input_arg(@env.args()) {
    Ok(Some(value)) =>
      if value == "__help__" {
        println(usage())
        return
      } else {
        value
      }
    Ok(None) => {
      println(usage())
      return
    }
    Err(message) => {
      println("argument error: \{message}")
      println(usage())
      abort("invalid snapshot audit CLI arguments")
    }
  }
  let snapshot = match @moonflowgraph.RunSnapshot::from_json(input) {
    Ok(snapshot) => snapshot
    Err(err) => {
      println("snapshot audit failed: \{err.message()}")
      abort("snapshot audit failed")
    }
  }
  println(render_audit_report(snapshot))
}