///|
pub struct HeaderCheck {
  code : String
  detail : String
} derive(Eq, Debug)

///|
pub fn check_headers(headers : Array[Header]) -> Array[HeaderCheck] {
  let out : Array[HeaderCheck] = []
  check_duplicate_singleton(headers, out, "From")
  check_duplicate_singleton(headers, out, "Subject")
  check_duplicate_singleton(headers, out, "Date")
  check_duplicate_singleton(headers, out, "Message-ID")
  for header in headers {
    if header.name == "" {
      out.push({ code: "header.name.empty", detail: header.value })
    }
    if header.value == "" {
      out.push({ code: "header.value.empty", detail: header.name })
    }
    if header.name.contains(" ") {
      out.push({ code: "header.name.space", detail: header.name })
    }
  }
  out
}

///|
fn check_duplicate_singleton(
  headers : Array[Header],
  out : Array[HeaderCheck],
  name : String,
) -> Unit {
  let count = all_header_values(headers, name).length()
  if count > 1 {
    out.push({
      code: "header.duplicate." + lower_ascii(name),
      detail: count.to_string(),
    })
  }
}

///|
pub fn check_message_headers(message : MailMessage) -> Array[HeaderCheck] {
  check_headers(message.headers)
}

///|
pub fn has_header_check(checks : Array[HeaderCheck], code : String) -> Bool {
  for item in checks {
    if item.code == code {
      return true
    }
  }
  false
}