///|
pub fn markdown_report(message : MailMessage) -> String {
  let mut out = ""
  let title = if message.subject == "" {
    "(no subject)"
  } else {
    message.subject
  }
  out = out + "# " + title + "\n\n"
  out = out + "- From: " + format_address_list(message.from) + "\n"
  out = out + "- To: " + format_address_list(message.to) + "\n"
  out = out + "- Date: " + message.date + "\n"
  out = out + "- Category: " + category_name(classify_message(message)) + "\n"
  out = out + "- Parts: " + part_count(message).to_string() + "\n"
  out = out + "- Attachments: " + attachment_count(message).to_string() + "\n"
  out = out + "- Sender Domain: " + sender_domain(message) + "\n"
  let urls = message_urls(message)
  if urls.length() > 0 {
    out = out + "\n## URLs\n"
    for url in urls {
      out = out + "- " + url + "\n"
    }
  }
  let attachments = attachment_infos(message)
  if attachments.length() > 0 {
    out = out + "\n## Attachments\n"
    for item in attachments {
      out = out + "- " + item.filename + " (" + item.content_type + ")\n"
    }
  }
  let findings = lint_message(message)
  if findings.length() > 0 {
    out = out + "\n## Findings\n"
    for item in findings {
      out = out +
        "- " +
        severity_name(item.severity) +
        " " +
        item.code +
        ": " +
        item.message +
        "\n"
    }
  }
  out
}

///|
pub fn corpus_markdown_report(messages : Array[MailMessage]) -> String {
  let stats = compute_stats(messages)
  let mut out = "# Mail Corpus Report\n\n"
  out = out + stats_summary(stats) + "\n\n"
  out = out + "## Categories\n"
  for pair in category_counts(messages) {
    out = out + "- " + pair.0 + ": " + pair.1.to_string() + "\n"
  }
  out
}

///|
fn severity_name(severity : Severity) -> String {
  match severity {
    Info => "info"
    Warning => "warning"
    Error => "error"
  }
}

///|
fn format_address_list(items : Array[Address]) -> String {
  let mut out = ""
  let mut i = 0
  for item in items {
    if i > 0 {
      out = out + ", "
    }
    out = out + format_address(item)
    i = i + 1
  }
  out
}