///|
priv struct PdfPageNumberLookup {
  values : @hashmap.HashMap[Int, Int]
}

///|
fn pdf_page_number_lookup(
  page_reference_numbers : ArrayView[Int],
) -> PdfPageNumberLookup {
  let values : @hashmap.HashMap[Int, Int] = HashMap([])
  for index in 0.. Int {
  match self.values.get(object_number) {
    Some(page_number) => page_number
    None => 0
  }
}

///|
fn pdf_destination_page_number_of_target(
  page_numbers : PdfPageNumberLookup,
  target : @destination.PdfTargetPage,
) -> Int {
  match target {
    TargetOtherDocPageNumber(number) => number + 1
    TargetPageObject(object_number) => page_numbers.page_number(object_number)
  }
}

///|
fn PdfDocument::pdf_destination_page_number_with_lookup(
  self : PdfDocument,
  destination : @destination.PdfDestination,
  page_numbers : PdfPageNumberLookup,
) -> Int raise @core.PdfError {
  match destination {
    DestNamed(_) | DestString(_) => {
      let resolved = self.read_destination(
        pdf_object_of_destination(destination),
      )
      if resolved == destination {
        0
      } else {
        self.pdf_destination_page_number_with_lookup(resolved, page_numbers)
      }
    }
    DestAction(action) =>
      match
        (
          self.lookup_direct(pdf_dest_s_key(), action),
          self.lookup_direct(pdf_dest_d_key(), action),
        ) {
        (Some(PdfNameObject(name)), Some(raw_destination)) if name ==
          pdf_dest_goto_name() =>
          self.pdf_destination_page_number_with_lookup(
            self.read_destination(raw_destination),
            page_numbers,
          )
        _ => 0
      }
    DestXYZ(target, _, _, _)
    | DestFit(target)
    | DestFitH(target, _)
    | DestFitV(target, _)
    | DestFitR(target, _, _, _, _)
    | DestFitB(target)
    | DestFitBH(target, _)
    | DestFitBV(target, _) =>
      pdf_destination_page_number_of_target(page_numbers, target)
    _ => 0
  }
}

///|
fn PdfDocument::pdf_destination_page_number(
  self : PdfDocument,
  destination : @destination.PdfDestination,
  page_reference_numbers : ArrayView[Int],
) -> Int raise @core.PdfError {
  self.pdf_destination_page_number_with_lookup(
    destination,
    pdf_page_number_lookup(page_reference_numbers),
  )
}