///|
pub fn sensitive_path_patterns() -> Array[String] {
  [
    "/admin", "/login", "/logout", "/account", "/private", "/internal", "/debug",
    "/.git", "/backup", "/config",
  ]
}

///|
pub fn sensitive_paths_allowed(text : String, agent : String) -> Array[String] {
  let robots = parse(text)
  let result : Array[String] = []
  for path in sensitive_path_patterns() {
    if decide(robots, agent, path).allowed {
      result.push(path)
    }
  }
  result
}

///|
pub fn sensitive_report(text : String, agent : String) -> String {
  let paths = sensitive_paths_allowed(text, agent)
  if paths.is_empty() {
    "ok"
  } else {
    "sensitive paths allowed: " + join_with(paths, ",")
  }
}

///|
pub fn protects_sensitive_defaults(text : String, agent : String) -> Bool {
  sensitive_paths_allowed(text, agent).is_empty()
}

///|
pub fn missing_common_blocks(text : String, agent : String) -> Array[String] {
  let robots = parse(text)
  let missing : Array[String] = []
  for path in sensitive_path_patterns() {
    if decide(robots, agent, path).allowed {
      missing.push("Disallow: " + path)
    }
  }
  missing
}

///|
pub fn suggested_security_group(agent : String) -> Group {
  let mut group = group_for_agents([agent])
  for path in sensitive_path_patterns() {
    group = group_add_disallow(group, path)
  }
  group
}

///|
pub fn security_patch(agent : String) -> String {
  render_group(suggested_security_group(agent))
}

///|
pub fn security_score(text : String, agent : String) -> Int {
  let total = sensitive_path_patterns().length()
  let open = sensitive_paths_allowed(text, agent).length()
  if total == 0 {
    100
  } else {
    (total - open) * 100 / total
  }
}