///|
pub fn robots_from_group(group : Group) -> Robots {
  { groups: [group], sitemaps: [], hosts: [] }
}

///|
pub fn robots_with_metadata(
  groups : Array[Group],
  sitemaps : Array[String],
  hosts : Array[String],
) -> Robots {
  { groups, sitemaps, hosts }
}

///|
pub fn group_for_agents(agents : Array[String]) -> Group {
  let normalized : Array[String] = []
  for agent in agents {
    normalized.push(normalize_agent(agent))
  }
  { agents: normalized, rules: [], crawl_delay: None }
}

///|
pub fn group_add_allow(group : Group, pattern : String) -> Group {
  let rules : Array[Rule] = []
  for rule in group.rules {
    rules.push(rule)
  }
  rules.push(allow_rule(normalize_path(pattern)))
  { agents: group.agents, rules, crawl_delay: group.crawl_delay }
}

///|
pub fn group_add_disallow(group : Group, pattern : String) -> Group {
  let rules : Array[Rule] = []
  for rule in group.rules {
    rules.push(rule)
  }
  rules.push(disallow_rule(normalize_path(pattern)))
  { agents: group.agents, rules, crawl_delay: group.crawl_delay }
}

///|
pub fn group_set_delay(group : Group, delay : Int) -> Group {
  { agents: group.agents, rules: group.rules, crawl_delay: Some(delay) }
}

///|
pub fn allow_all(agent : String) -> Robots {
  robots_from_group(group_for_agents([agent]))
}

///|
pub fn block_all(agent : String) -> Robots {
  robots_from_group(group_add_disallow(group_for_agents([agent]), "/"))
}

///|
pub fn block_paths(agent : String, paths : Array[String]) -> Robots {
  let mut group = group_for_agents([agent])
  for path in paths {
    group = group_add_disallow(group, path)
  }
  robots_from_group(group)
}

///|
pub fn allow_public_private(
  private_prefix : String,
  public_prefix : String,
) -> Robots {
  let group = group_add_allow(
    group_add_disallow(group_for_agents(["*"]), private_prefix),
    public_prefix,
  )
  robots_from_group(group)
}