///|
pub fn sitemap_urls_allowed(
  xml : String,
  robots_text : String,
  agent : String,
) -> Array[String] {
  filter_urls(robots_text, agent, sitemap_urls(xml))
}

///|
pub fn sitemap_urls_blocked(
  xml : String,
  robots_text : String,
  agent : String,
) -> Array[String] {
  let robots = parse(robots_text)
  let result : Array[String] = []
  for url in sitemap_urls(xml) {
    if !decide_url(robots, agent, url).allowed ||
      !host_matches_robots(robots, url) {
      result.push(url)
    }
  }
  result
}

///|
pub fn sitemap_coverage_report(
  xml : String,
  robots_text : String,
  agent : String,
) -> String {
  let all = sitemap_urls(xml)
  let allowed = sitemap_urls_allowed(xml, robots_text, agent)
  let blocked = sitemap_urls_blocked(xml, robots_text, agent)
  "total=" +
  all.length().to_string() +
  "\nallowed=" +
  allowed.length().to_string() +
  "\nblocked=" +
  blocked.length().to_string()
}

///|
pub fn sitemap_by_extension(xml : String, ext : String) -> Array[String] {
  let result : Array[String] = []
  for url in sitemap_urls(xml) {
    if path_has_extension(url_path_without_query(url), ext) {
      result.push(url)
    }
  }
  result
}

///|
pub fn sitemap_same_host(xml : String, host : String) -> Array[String] {
  let result : Array[String] = []
  for url in sitemap_urls(xml) {
    if same_host(url, host) {
      result.push(url)
    }
  }
  result
}

///|
pub fn same_host(url : String, host : String) -> Bool {
  match url_host(url) {
    Some(found) => lower_ascii(found) == lower_ascii(host)
    None => false
  }
}

///|
pub fn sitemap_inventory(xml : String) -> String {
  let lines : Array[String] = []
  for entry in sitemap_entries(xml) {
    lines.push(
      entry.loc +
      " " +
      entry.lastmod +
      " " +
      entry.changefreq +
      " " +
      entry.priority,
    )
  }
  if lines.is_empty() {
    "empty"
  } else {
    join_lines(lines)
  }
}