///|
async fn prompt_preferred_field(
  label : String,
  current : String?,
  builtin_default : String,
) -> String? raise CliError {
  let current_display = preferred_display_value(current, builtin_default)
  println("\{label} [\{current_display}] (press Enter to keep):")
  guard read_line_from_stdin() is Some(line) else {
    raise CliError("failed to read input from stdin")
  }
  let value = line.trim().to_owned()
  guard !value.is_empty() else { current }
  Some(value)
}

///|
fn preferred_display_value(
  current : String?,
  builtin_default : String,
) -> String {
  current.unwrap_or(" (effective: \{builtin_default})")
}

///|
async fn PreferredConfig::interactive_prompt(
  self : PreferredConfig,
) -> PreferredConfig raise CliError {
  let license = prompt_preferred_field(
    "default license",
    self.license,
    DEFAULT_LICENSE,
  )
  let host = prompt_preferred_field("default host", self.host, DEFAULT_HOST)
  let preferred_target = prompt_preferred_field(
    "default target",
    self.preferred_target,
    DEFAULT_TARGET,
  )
  { username: self.username, license, host, preferred_target }
}

///|
async fn configure_preferred_defaults() -> String raise CliError {
  guard home_dir() is Some(home) else {
    raise CliError("cannot locate home directory from HOME/USERPROFILE")
  }
  let preferred_dir = preferred_dir_path(home)
  ensure_dir(preferred_dir)
  let preferred_file = preferred_file_path(home)
  let preferred = load_preferred_config(preferred_file)

  println("configure preferred defaults")
  println("leave input empty to keep existing preference")

  let updated_preferred = preferred.interactive_prompt()
  save_preferred_config(preferred_file, updated_preferred)
  "updated preferences in \{preferred_file}"
}

///|
async fn show_preferred_defaults() -> String raise CliError {
  guard home_dir() is Some(home) else {
    raise CliError("cannot locate home directory from HOME/USERPROFILE")
  }
  let preferred_file = preferred_file_path(home)
  let preferred = load_preferred_config(preferred_file)
  let license = preferred_display_value(preferred.license, DEFAULT_LICENSE)
  let host = preferred_display_value(preferred.host, DEFAULT_HOST)
  let preferred_target = preferred_display_value(
    preferred.preferred_target,
    DEFAULT_TARGET,
  )
  (
    $|current preferences
    $|file: \{preferred_file}
    $|license: \{license}
    $|host: \{host}
    $|target: \{preferred_target}
  )
}