///|
fn pdf_ua_matterhorn_check_10_001_differences(
  differences : @syntax.PdfObject,
) -> Json? {
  match differences {
    PdfArray(items) =>
      for item in items {
        match item {
          PdfNameObject(name) if !pdf_ua_matterhorn_agl_glyph_name(name) =>
            return Some(Json::null())
          _ => ()
        }
      }
    _ => ()
  }
  None
}

///|
fn PdfDocument::pdf_ua_matterhorn_check_10_001_font(
  self : PdfDocument,
  font : @syntax.PdfObject,
) -> (Json?, Bool) {
  if self.lookup_direct(pdf_text_tounicode_key_name, font) is Some(_) {
    (None, false)
  } else {
    match self.lookup_direct(pdf_text_encoding_key_name, font) {
      Some(PdfNameObject(name)) if name == pdf_text_mac_roman_encoding_name ||
        name == pdf_text_mac_expert_encoding_name ||
        name == pdf_text_win_ansi_encoding_name => (None, false)
      Some(encoding) =>
        match self.lookup_direct(pdf_text_differences_key_name, encoding) {
          Some(differences) =>
            (pdf_ua_matterhorn_check_10_001_differences(differences), false)
          None => (Some(Json::string("No /Differences")), false)
        }
      None =>
        match self.lookup_direct(pdf_text_subtype_key_name, font) {
          Some(PdfNameObject(subtype)) if subtype == pdf_text_type0_name =>
            (None, true)
          _ => (Some(Json::string("Not a Type 0 font")), false)
        }
    }
  }
}

///|
fn PdfDocument::pdf_ua_matterhorn_all_page_numbers(
  self : PdfDocument,
) -> Array[Int] raise @core.PdfError {
  let pages : Array[Int] = []
  for page in 1..<=self.endpage() {
    pages.push(page)
  }
  pages
}

///|
fn PdfDocument::pdf_ua_matterhorn_check_10_001(
  self : PdfDocument,
) -> Json? raise @core.PdfError {
  for entry in self.list_fonts(self.pdf_ua_matterhorn_all_page_numbers()) {
    match
      (
        self.lookup_direct(pdf_text_type_key_name, entry.font),
        self.lookup_direct(pdf_text_subtype_key_name, entry.font),
      ) {
      (Some(PdfNameObject(type_name)), Some(PdfNameObject(subtype))) if type_name ==
        pdf_text_font_name &&
        (
          subtype == pdf_ua_matterhorn_cid_font_type0() ||
          subtype == pdf_ua_matterhorn_cid_font_type2()
        ) => ()
      (Some(PdfNameObject(type_name)), _) if type_name == pdf_text_font_name => {
        let (failure, unimplemented) = self.pdf_ua_matterhorn_check_10_001_font(
          entry.font,
        )
        if unimplemented {
          return None
        }
        match failure {
          Some(extra) => return Some(extra)
          None => ()
        }
      }
      _ => ()
    }
  }
  None
}