///|
async fn main {
  run_cli() catch {
    e => @cli.exit_error(e)
  }
}

///|
async fn run_cli() -> Unit {
  let args = @env.args()
  if (args.length() != 5 && args.length() != 6 && args.length() != 7) ||
    (
      args.length() == 6 &&
      args[5] != "--require-compatible" &&
      args[5] != "--require-unchanged"
    ) ||
    (args.length() == 7 && args[5] != "--verify") {
    raise @jieheng.Invalid(
      code="arguments",
      path="cli",
      message="usage: moon run cmd/migration -- BEFORE.json AFTER.json START END [--require-compatible | --require-unchanged | --verify REPORT.json]",
    )
  }
  let b = @jieheng.decode_catalog(@cli.read_input(args[1]))
  let a = @jieheng.decode_catalog(@cli.read_input(args[2]))
  let r = if args.length() == 7 {
    @jieheng.decode_catalog_migration(@cli.read_input(args[6]))
  } else {
    @jieheng.audit_catalog_migration(b, a, args[3], args[4])
  }
  @jieheng.verify_catalog_migration(b, a, args[3], args[4], r)
  if args.length() == 6 {
    for span in r.spans {
      for change in span.changes {
        if args[5] == "--require-unchanged" || change.is_blocking() {
          raise @jieheng.Invalid(
            code="migration",
            path="migration.spans",
            message="metric '\{span.metric}' [\{span.starts_on}, \{span.ends_before}) requires mapping or review; run without the gate to inspect all changes",
          )
        }
      }
    }
  }
  @stdio.stdout.write(@jieheng.encode_catalog_migration(r) + "\n")
}