///|
fn invalid(message : String) -> Unit {
  println("Cannot compare batch reports: \{message}")
  @sys.exit(2)
}

///|
fn read_batch(path : String) -> Result[@lens.BatchReport, String] {
  let source = @utf8.decode(@fs.read_file_to_bytes(path)) catch {
    e => return Err("Cannot read UTF-8 report \{path}: \{Repr(e)}")
  }
  @lens.BatchReport::parse_json(source)
}

///|
fn main {
  let args = @env.args()[argument_prefix():].to_owned()
  if args.length() < 2 ||
    args.length() > 3 ||
    (args.length() == 3 && args[2] != "--json") {
    invalid(
      "usage: migration-lens-compare-batch   [--json]",
    )
    return
  }
  let baseline = match read_batch(args[0]) {
    Ok(b) => b
    Err(e) => {
      invalid("Baseline: " + e)
      return
    }
  }
  let current = match read_batch(args[1]) {
    Ok(b) => b
    Err(e) => {
      invalid("Current: " + e)
      return
    }
  }
  let delta = match @lens.compare_batches(baseline, current) {
    Ok(d) => d
    Err(e) => {
      invalid(e)
      return
    }
  }
  if args.length() == 3 {
    println(delta.to_json().stringify())
  } else {
    println(delta.to_text())
  }
  @sys.exit(delta.exit_code())
}

///|
#cfg(target="js")
fn argument_prefix() -> Int32 {
  2
}

///|
#cfg(target="wasm")
fn argument_prefix() -> Int32 {
  1
}

///|
#cfg(target="wasm-gc")
fn argument_prefix() -> Int32 {
  1
}

///|
#cfg(target="native")
fn argument_prefix() -> Int32 {
  1
}