///|
pub struct MailStats {
  messages : Int
  parts : Int
  attachments : Int
  with_html : Int
  with_plain : Int
  with_authentication_results : Int
} derive(Eq, Debug)

///|
pub fn compute_stats(messages : Array[MailMessage]) -> MailStats {
  let mut parts = 0
  let mut attachments = 0
  let mut with_html = 0
  let mut with_plain = 0
  let mut with_auth = 0
  for message in messages {
    parts = parts + part_count(message)
    attachments = attachments + attachment_count(message)
    if html_text(message) != "" {
      with_html = with_html + 1
    }
    if plain_text(message) != "" {
      with_plain = with_plain + 1
    }
    if authentication_results_from_message(message).length() > 0 {
      with_auth = with_auth + 1
    }
  }
  {
    messages: messages.length(),
    parts,
    attachments,
    with_html,
    with_plain,
    with_authentication_results: with_auth,
  }
}

///|
pub fn stats_summary(stats : MailStats) -> String {
  "messages=" +
  stats.messages.to_string() +
  " parts=" +
  stats.parts.to_string() +
  " attachments=" +
  stats.attachments.to_string() +
  " html=" +
  stats.with_html.to_string() +
  " plain=" +
  stats.with_plain.to_string() +
  " auth=" +
  stats.with_authentication_results.to_string()
}

///|
pub fn messages_with_attachments(
  messages : Array[MailMessage],
) -> Array[MailMessage] {
  let out : Array[MailMessage] = []
  for message in messages {
    if attachment_count(message) > 0 {
      out.push(message)
    }
  }
  out
}

///|
pub fn messages_with_lint_errors(
  messages : Array[MailMessage],
) -> Array[MailMessage] {
  let out : Array[MailMessage] = []
  for message in messages {
    if error_count(lint_message(message)) > 0 {
      out.push(message)
    }
  }
  out
}