///|
fn usage() -> String {
  (
    #|NeighborRota - explainable community scheduling
    #|
    #|Usage:
    #|  neighbor-rota help
    #|  neighbor-rota version
    #|  neighbor-rota scenarios
    #|  neighbor-rota demo [community|campus] [summary|json|markdown|csv]
    #|  neighbor-rota reschedule [summary|markdown]
    #|
    #|Examples:
    #|  moon run cmd/neighbor-rota -- demo community summary
    #|  moon run cmd/neighbor-rota -- demo campus json
    #|  moon run cmd/neighbor-rota -- reschedule markdown
    #|
  )
}

///|
fn scenarios() -> String {
  (
    #|community-care      Community care visits with skills and continuity
    #|campus-volunteers   Campus event volunteers across service zones
    #|sudden-absence      Replan community care after a worker absence
    #|
  )
}

///|
fn render_schedule(schedule : @rota.Schedule, format : String) -> String {
  match format {
    "summary" => @rota.schedule_summary(schedule)
    "json" => @rota.schedule_to_json(schedule)
    "markdown" | "md" => @rota.schedule_to_markdown(schedule)
    "csv" => @rota.assignments_to_csv(schedule.assignments)
    _ => "unknown format: \{format}\n\n\{usage()}"
  }
}

///|
fn run_demo(arguments : Array[String]) -> String {
  let scenario_name = if arguments.length() >= 2 {
    arguments[1]
  } else {
    "community"
  }
  let format = if arguments.length() >= 3 {
    arguments[2].to_lower()
  } else {
    "summary"
  }
  match @rota.parse_demo_scenario(scenario_name) {
    None => "unknown scenario: \{scenario_name}\n\n\{scenarios()}"
    Some(@rota.SuddenAbsence) =>
      if format == "markdown" || format == "md" {
        @rota.reschedule_to_markdown(@rota.run_absence_demo())
      } else {
        @rota.reschedule_summary(@rota.run_absence_demo())
      }
    Some(scenario) => render_schedule(@rota.run_demo(scenario), format)
  }
}

///|
fn main {
  let raw = @env.args()
  let arguments : Array[String] = []
  for index = 1; index < raw.length(); index = index + 1 {
    arguments.push(raw[index])
  }
  let command = if arguments.length() == 0 {
    "help"
  } else {
    arguments[0].to_lower()
  }
  let output = match command {
    "help" | "-h" | "--help" => usage()
    "version" | "-v" | "--version" => "NeighborRota 0.1.0\n"
    "scenarios" | "list-scenarios" => scenarios()
    "demo" => run_demo(arguments)
    "reschedule" => {
      let format = if arguments.length() >= 2 {
        arguments[1]
      } else {
        "summary"
      }
      if format == "markdown" || format == "md" {
        @rota.reschedule_to_markdown(@rota.run_absence_demo())
      } else {
        @rota.reschedule_summary(@rota.run_absence_demo())
      }
    }
    _ => "unknown command: \{command}\n\n\{usage()}"
  }
  println(output)
}