// 编排层:一封原始邮件 + 客户端 IP → 完整认证报告。

///|
/// 从 From 头取域名。
pub fn from_domain(message : Message) -> String? {
  let fields = message.headers_named("From")
  if fields.length() == 0 {
    return None
  }
  let value = header_value_text(fields[0])
  match value.split_once("@") {
    None => None
    Some((_, rest)) => {
      let chars = rest.to_array()
      let out = StringBuilder()
      let mut i = 0
      while i < chars.length() {
        let c = chars[i]
        if c == '>' ||
          c == ' ' ||
          c == '\t' ||
          c == '\r' ||
          c == '\n' ||
          c == ';' ||
          c == ',' {
          break
        }
        out.write_char(c)
        i = i + 1
      }
      let domain = trim_wsp(out.to_string())
      if domain.length() == 0 {
        None
      } else {
        Some(normalize_name(domain))
      }
    }
  }
}

///|
/// 对一封邮件做完整认证。
///
/// `ip` 是建立 SMTP 连接的对端地址,SPF 必须依赖它,邮件本身不携带。
/// `now = 0` 表示不校验签名过期时间;`sample < 0` 表示 DMARC pct 使用完整策略。
pub fn[R : Resolver] verify_message(
  resolver : R,
  raw : BytesView,
  ip : String,
  mail_from : String,
  helo : String,
  now : Int,
  sample : Int,
) -> AuthReport {
  let message = parse_message(raw)
  let dkim = if now > 0 {
    verify_dkim_all(resolver, message, now~)
  } else {
    verify_dkim_all(resolver, message)
  }
  let sender_domain = match from_domain(message) {
    Some(domain) => domain
    None => ""
  }
  let spf_domain = if mail_from.length() > 0 {
    normalize_name(mail_from)
  } else {
    sender_domain
  }
  let spf = if spf_domain.length() == 0 {
    None
  } else {
    let sender = if mail_from.length() > 0 {
      mail_from
    } else {
      "postmaster@" + spf_domain
    }
    if helo.length() > 0 {
      Some(evaluate_spf(resolver, spf_domain, ip, helo~, sender~))
    } else {
      Some(evaluate_spf(resolver, spf_domain, ip, sender~))
    }
  }
  let dmarc = if sender_domain.length() == 0 {
    None
  } else if sample >= 0 {
    Some(evaluate_dmarc(resolver, sender_domain, dkim, spf, sample~))
  } else {
    Some(evaluate_dmarc(resolver, sender_domain, dkim, spf))
  }
  { dkim, spf, dmarc, }
}