///|
fn print_help() -> Unit {
  println("MoonAqueousSpec - auditable aqueous speciation")
  println("")
  println("Commands:")
  println(
    "  demo [name]       solve carbonate (default), sulfate, hydrolysis or water",
  )
  println("  demo-json         print the carbonate Problem JSON")
  println("  fixture-json name print a named Problem JSON")
  println("  solve-json  solve a Problem JSON passed as one argument")
  println("  inspect-json      validate and inspect a Problem JSON argument")
  println("  sensitivity-json  solve a SensitivityRequest JSON argument")
  println("")
  println("All concentrations are mol/L. Mineral SI is diagnostic only.")
}

///|
#cfg(target="js")
fn cli_args() -> Array[String] {
  let args = @env.args()
  if args.length() < 2 {
    []
  } else {
    Array::makei(args.length() - 1, fn(i) { args[i + 1] })
  }
}

///|
#cfg(not(target="js"))
fn cli_args() -> Array[String] {
  @env.args()
}

///|
fn main {
  let args = cli_args()
  if args.length() < 2 {
    print_help()
  } else {
    let command = args[1]
    match command {
      "demo" => {
        let name = if args.length() >= 3 { args[2] } else { "carbonate" }
        match @equilibrium.named_problem(name) {
          Ok(problem) =>
            println(
              @equilibrium.solve_json(@equilibrium.problem_to_json(problem)),
            )
          Err(error) => {
            let payload : Json = { "ok": false, "error": error.message() }
            println(payload.stringify())
          }
        }
      }
      "demo-json" => println(@equilibrium.demo_json())
      "fixture-json" =>
        if args.length() >= 3 {
          println(@equilibrium.fixture_json(args[2]))
        } else {
          print_help()
        }
      "inspect-json" =>
        if args.length() >= 3 {
          println(@equilibrium.inspect_json(args[2]))
        } else {
          print_help()
        }
      "sensitivity-json" =>
        if args.length() >= 3 {
          println(@equilibrium.sensitivity_json(args[2]))
        } else {
          print_help()
        }
      "solve-json" =>
        if args.length() >= 3 {
          println(@equilibrium.solve_json(args[2]))
        } else {
          print_help()
        }
      _ => print_help()
    }
  }
}