///|
fn parse_rounds(value : String) -> Int {
  if value.is_empty() {
    10
  } else {
    let mut result = 0
    for c in value {
      if c >= '0' && c <= '9' {
        result = result * 10 + c.to_int() - '0'.to_int()
      }
    }
    if result <= 0 {
      1
    } else {
      result
    }
  }
}

///|
fn print_help() -> Unit {
  println("moonbit-deid - deterministic clinical PHI redaction")
  println("")
  println("Usage: moon run cmd/main -- [options] [text]")
  println("")
  println("Options:")
  println("  --audit                print the audit report")
  println("  --mode=preserve        preserve replacement length")
  println("  --mode=partial         keep edge characters")
  println("  --mode=hash            use deterministic stable hashes")
  println("  --benchmark[=N]        run N benchmark rounds")
  println("  --help                 show this help")
}

///|
fn run_benchmark(rounds : Int) -> Unit {
  try {
    let started = @env.now()
    let results = @deid.run_all_benchmarks(
      rounds,
      @deid.RedactionConfig::default(),
    )
    let elapsed = @env.now() - started
    let mut documents = 0
    let mut characters = 0
    let mut findings = 0
    for item in results {
      documents += item.documents * item.repetitions
      characters += item.input_characters
      findings += item.findings
    }
    println("benchmark.cases=" + results.length().to_string())
    println("benchmark.documents=" + documents.to_string())
    println("benchmark.input_characters=" + characters.to_string())
    println("benchmark.findings=" + findings.to_string())
    println("benchmark.elapsed_ms=" + elapsed.to_string())
    let divisor : UInt64 = if elapsed == 0 { 1 } else { elapsed }
    println(
      "benchmark.characters_per_ms=" +
      (characters.to_uint64() / divisor).to_string(),
    )
  } catch {
    err => println("benchmark.error=" + err.to_string())
  }
}

///|
fn main raise {
  let args = @env.args()
  if args.any(fn(arg : String) { arg == "--help" || arg == "-h" }) {
    print_help()
    return
  }
  let mut show_audit = false
  let mut benchmark : String? = None
  let mut options = @deid.token_options()
  let text_parts = []
  for i in 1.. {
      run_benchmark(parse_rounds(value))
      return
    }
    None => ()
  }
  let sample = if text_parts.is_empty() {
    "姓名:张三,电话13800138000,身份证110101199003071234。"
  } else {
    text_parts.join(" ")
  }
  let result = @deid.redact(sample, options~)
  println(result.text)
  if show_audit {
    println(@deid.audit_markdown(result.audit))
  }
}