///|
fn invalid_report(message : String) -> Unit {
  println("Cannot load saved report: \{message}")
  @sys.exit(2)
}

///|
fn main {
  let args = @env.args()[argument_prefix():].to_owned()
  if args.length() < 2 ||
    args.length() > 3 ||
    (args[1] != "text" && args[1] != "json" && args[1] != "sarif") ||
    (args[1] == "sarif" && args.length() != 3) ||
    (args[1] != "sarif" && args.length() != 2) {
    invalid_report(
      "usage: migration-lens-report   [repository-relative-artifact-path]",
    )
    return
  }
  let source = @utf8.decode(@fs.read_file_to_bytes(args[0])) catch {
    e => {
      invalid_report("Cannot read UTF-8 file: \{Repr(e)}")
      return
    }
  }
  let report = match @lens.Report::parse_json(source) {
    Ok(report) => report
    Err(e) => {
      invalid_report(e)
      return
    }
  }
  match args[1] {
    "json" => println(report.to_json().stringify())
    "sarif" =>
      match report.to_sarif(args[2]) {
        Ok(log) => println(log.stringify())
        Err(e) => {
          invalid_report(e)
          return
        }
      }
    _ => println(report.to_text())
  }
  @sys.exit(report.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
}