///|
pub fn parse_cli(args : Array[String]) -> CliParseResult {
  if args.length() == 0 {
    return valid_cli(Help, Markdown, "", "", "")
  }
  let command = match args[0] {
    "help" | "--help" | "-h" => Help
    "version" | "--version" => Version
    "demo" => Demo
    "validate" => Validate
    "render" => Render
    "benchmark" => Benchmark
    _ => return invalid_cli("unknown command: " + args[0])
  }
  let mut format = Markdown
  let mut input = ""
  let mut input_path = ""
  let mut output = ""
  let mut index = 1
  while index < args.length() {
    let flag = args[index]
    if flag == "--format" {
      if index + 1 >= args.length() {
        return invalid_cli("--format needs a value")
      }
      match cli_format(args[index + 1]) {
        Some(value) => format = value
        None => return invalid_cli("unknown format: " + args[index + 1])
      }
      index += 2
    } else if flag == "--text" {
      if index + 1 >= args.length() {
        return invalid_cli(flag + " needs a value")
      }
      input = args[index + 1]
      index += 2
    } else if flag == "--input" {
      if index + 1 >= args.length() {
        return invalid_cli(flag + " needs a value")
      }
      input_path = args[index + 1]
      index += 2
    } else if flag == "--output" {
      if index + 1 >= args.length() {
        return invalid_cli("--output needs a value")
      }
      output = args[index + 1]
      index += 2
    } else {
      return invalid_cli("unknown option: " + flag)
    }
  }
  if input != "" && input_path != "" {
    invalid_cli("--text and --input are mutually exclusive")
  } else {
    valid_cli(command, format, input, input_path, output)
  }
}

///|
pub fn cli_user_args(args : Array[String]) -> Array[String] {
  let start = if args.length() > 0 && looks_like_program(args[0]) {
    1
  } else {
    0
  }
  let result : Array[String] = []
  for i in start.. Bool {
  text.contains(".wasm") ||
  text.contains(".exe") ||
  text.contains(".js") ||
  text.contains("_build")
}

///|
fn cli_format(name : String) -> CliFormat? {
  match normalize_identifier(name) {
    "markdown" | "md" => Some(Markdown)
    "html" => Some(Html)
    "css" => Some(Css)
    "json" => Some(Json)
    "yaml" | "yml" => Some(Yaml)
    "tailwind" => Some(Tailwind)
    "figma" | "figma-tokens" => Some(Figma)
    _ => None
  }
}

///|
fn valid_cli(
  command : CliCommand,
  format : CliFormat,
  input : String,
  input_path : String,
  output : String,
) -> CliParseResult {
  let request = CliRequest::new(command, format, input, output)
  { request: Some({ ..request, input_path, }), errors: [] }
}

///|
fn invalid_cli(message : String) -> CliParseResult {
  { request: None, errors: [message] }
}