///|
pub fn api_preferences_json_zh_gzip() -> RequestPreferences {
  RequestPreferences(
    accept="application/json;q=1, application/problem+json;q=0.9, */*;q=0.1",
    accept_language="zh-CN, zh;q=0.8, en;q=0.5",
    accept_encoding="br;q=1, gzip;q=0.9, identity;q=0.1",
    accept_charset="utf-8, *;q=0.2",
  )
}

///|
pub fn browser_preferences_html_en_br() -> RequestPreferences {
  RequestPreferences(
    accept="text/html, application/xhtml+xml;q=0.9, application/json;q=0.6, */*;q=0.1",
    accept_language="en-US, en;q=0.8, zh;q=0.5",
    accept_encoding="br, gzip;q=0.8, identity;q=0.2",
    accept_charset="utf-8",
  )
}

///|
pub fn conservative_preferences() -> RequestPreferences {
  RequestPreferences(
    accept="application/json",
    accept_language="en",
    accept_encoding="identity",
    accept_charset="utf-8",
  )
}

///|
pub fn api_variants() -> Array[ServerVariant] {
  [
    ServerVariant(
      "json.zh.gzip",
      "application/json;charset=utf-8",
      language="zh-CN",
      encoding="gzip",
      charset="utf-8",
      server_weight=1000,
    ),
    ServerVariant(
      "json.zh.br",
      "application/json;charset=utf-8",
      language="zh-CN",
      encoding="br",
      charset="utf-8",
      server_weight=980,
    ),
    ServerVariant(
      "problem.zh.gzip",
      "application/problem+json;charset=utf-8",
      language="zh-CN",
      encoding="gzip",
      charset="utf-8",
      server_weight=900,
    ),
    ServerVariant(
      "json.en.identity",
      "application/json;charset=utf-8",
      language="en-US",
      encoding="identity",
      charset="utf-8",
      server_weight=950,
    ),
  ]
}

///|
pub fn document_variants() -> Array[ServerVariant] {
  [
    ServerVariant(
      "html.en.br",
      "text/html;charset=utf-8",
      language="en-US",
      encoding="br",
      charset="utf-8",
      server_weight=1000,
    ),
    ServerVariant(
      "html.en.gzip",
      "text/html;charset=utf-8",
      language="en-US",
      encoding="gzip",
      charset="utf-8",
      server_weight=980,
    ),
    ServerVariant(
      "json.en.gzip",
      "application/json;charset=utf-8",
      language="en-US",
      encoding="gzip",
      charset="utf-8",
      server_weight=850,
    ),
    ServerVariant(
      "html.zh.gzip",
      "text/html;charset=utf-8",
      language="zh-CN",
      encoding="gzip",
      charset="utf-8",
      server_weight=900,
    ),
  ]
}

///|
pub fn negotiate_api_scenario() -> Result[VariantDecision, ParseError] {
  negotiate_variant(api_preferences_json_zh_gzip(), api_variants())
}

///|
pub fn negotiate_browser_document_scenario() -> Result[
  VariantDecision,
  ParseError,
] {
  negotiate_variant(browser_preferences_html_en_br(), document_variants())
}

///|
pub fn negotiate_conservative_api_scenario() -> Result[
  VariantDecision,
  ParseError,
] {
  negotiate_variant(conservative_preferences(), api_variants())
}

///|
pub fn api_response_summary() -> Result[ResponseSummary, ParseError] {
  match negotiate_api_scenario() {
    Ok(decision) => Ok(summarize_response(decision))
    Err(err) => Err(err)
  }
}

///|
pub fn browser_response_summary() -> Result[ResponseSummary, ParseError] {
  match negotiate_browser_document_scenario() {
    Ok(decision) => Ok(summarize_response(decision))
    Err(err) => Err(err)
  }
}

///|
pub fn audit_api_scenario() -> HeaderAudit {
  audit_preferences(api_preferences_json_zh_gzip())
}

///|
pub fn audit_browser_scenario() -> HeaderAudit {
  audit_preferences(browser_preferences_html_en_br())
}

///|
pub fn scenario_report() -> String {
  let buf = StringBuilder()
  match negotiate_api_scenario() {
    Ok(decision) => buf.write_string(format_variant_decision(decision))
    Err(_) => buf.write_string("api scenario failed")
  }
  buf.write_string("\n")
  match negotiate_browser_document_scenario() {
    Ok(decision) => buf.write_string(format_variant_decision(decision))
    Err(_) => buf.write_string("browser scenario failed")
  }
  buf.write_string("\n")
  buf.write_string(format_audit(audit_browser_scenario()))
  buf.to_string()
}