///|
fn print_help() -> Unit {
  let text =
    #|MoonAlign
    #|
    #|Usage:
    #|  moon run cmd/main -- --source-text  --target-text  [--mode sentence|paragraph] [--format json|tsv]
    #|
    #|Options:
    #|  --source-text     Source-language plain text
    #|  --target-text     Target-language plain text
    #|  --mode      sentence (default) or paragraph
    #|  --format    json (default) or tsv
    #|  --benchmark       Run the built-in reproducible benchmark suite
    #|  --help            Show this message
  println(text)
}

///|
fn parse_mode(value : String) -> @moonalign.SegmentMode {
  if value == "paragraph" {
    @moonalign.paragraph_mode()
  } else {
    @moonalign.sentence_mode()
  }
}

///|
fn parse_args(args : Array[String]) -> Map[String, String] {
  let parsed = Map([])
  let mut i = 0
  while i < args.length() {
    let current = args[i]
    if current == "--help" {
      parsed["help"] = "true"
      i += 1
    } else if current == "--benchmark" {
      parsed["benchmark"] = "true"
      i += 1
    } else if current.has_prefix("--") && i + 1 < args.length() {
      parsed[current.strip_prefix("--").unwrap().to_owned()] = args[i + 1]
      i += 2
    } else {
      i += 1
    }
  }
  parsed
}

///|
fn main {
  let argv = @env.args()
  let args = if argv.length() > 0 { argv[1:].to_owned() } else { [] }
  let parsed = parse_args(args)
  if parsed.contains("benchmark") {
    println(@moonalign.benchmark_to_json_string())
    return
  }
  if parsed.contains("help") ||
    !parsed.contains("source-text") ||
    !parsed.contains("target-text") {
    print_help()
    return
  }

  let source_text = parsed["source-text"]
  let target_text = parsed["target-text"]
  let options = @moonalign.with_segment_mode(
    @moonalign.default_options(),
    parse_mode(parsed.get_or_default("mode", "sentence")),
  )
  let report = @moonalign.align(source_text, target_text, options~)
  let format = parsed.get_or_default("format", "json")
  let rendered = if format == "tsv" {
    @moonalign.report_to_tsv(report)
  } else {
    @moonalign.report_to_json_string(report)
  }
  println(rendered)
}