///|
/// Plan one response, taking uncombined Retry-After values. Zero fields means
/// no server minimum; multiple fields or unsupported syntax stop the retry.
/// now_seconds is wall time; elapsed_ms is monotonic elapsed time.
pub fn decide_response(
  settings : Settings,
  http_method~ : String,
  status~ : Int,
  retry_index~ : Int,
  elapsed_ms~ : Int64,
  body_replayable~ : Bool,
  retry_after_values~ : Array[String],
  now_seconds~ : Int64,
  replay_safe? : Bool = false,
  sample_ppm? : Int = 1000000,
) -> Decision {
  // Preserve input, status, replay and attempt failures before parsing headers.
  let baseline = decide(
    settings,
    http_method~,
    status~,
    retry_index~,
    elapsed_ms~,
    body_replayable~,
    replay_safe~,
    sample_ppm~,
  )
  match baseline {
    Stop(_) => return baseline
    Wait(_) => ()
  }
  let server_delay_ms = match retry_after_values {
    [] => 0L
    [value] =>
      match retry_after_delay(value, now_seconds) {
        Some(delay) => delay
        None => return Stop(InvalidRetryAfter)
      }
    _ => return Stop(InvalidRetryAfter)
  }
  decide(
    settings,
    http_method~,
    status~,
    retry_index~,
    elapsed_ms~,
    body_replayable~,
    replay_safe~,
    sample_ppm~,
    server_delay_ms~,
  )
}