///|
fn main {
  run_cli(@env.args())
}

///|
fn run_cli(args : Array[String]) -> Unit {
  let normalized = normalize_args(args)
  if normalized.is_empty() ||
    normalized[0] == "help" ||
    normalized[0] == "--help" {
    print_help()
    return
  }
  if normalized[0] == "version" || normalized[0] == "--version" {
    println("range-tool \{@range.library_version()} (hjn0123/moon-http-range)")
    return
  }
  let command = normalized[0]
  let rest = normalized[1:].to_owned()
  match command {
    "parse" => cmd_parse(rest)
    "resolve" => cmd_resolve(rest)
    "content-range" => cmd_content_range(rest)
    "accept-ranges" => cmd_accept_ranges(rest)
    "plan" => cmd_plan(rest)
    "audit" => cmd_audit(rest)
    "if-range" => cmd_if_range(rest)
    "stats" => cmd_stats(rest)
    _ => print_error("UnknownCommand", "unknown command: \{command}")
  }
}

///|
fn normalize_args(args : Array[String]) -> Array[String] {
  for i = 0; i < args.length(); i = i + 1 {
    if known_command(args[i]) {
      return args[i:].to_owned()
    }
  }
  if args.is_empty() {
    []
  } else {
    args[args.length() - 1:].to_owned()
  }
}

///|
fn known_command(value : String) -> Bool {
  value == "parse" ||
  value == "resolve" ||
  value == "content-range" ||
  value == "accept-ranges" ||
  value == "plan" ||
  value == "audit" ||
  value == "if-range" ||
  value == "stats" ||
  value == "version" ||
  value == "help" ||
  value == "--version" ||
  value == "--help"
}

///|
fn print_help() -> Unit {
  println("range-tool 0.1.0 — RFC 9110 byte-range toolkit")
  println(
    "usage: range-tool  [options]",
  )
  println("range input: --range ; representation: --length ")
  println("content-range: --value ; accept-ranges: --value ")
  println(
    "audit: --details for per-finding JSON; if-range: --value  --etag ",
  )
}