///|
pub struct CrawlProfile {
  name : String
  agent : String
  seed_urls : Array[String]
  max_urls : Int
} derive(Debug, Eq)

///|
pub fn profile(
  name : String,
  agent : String,
  seed_urls : Array[String],
  max_urls : Int,
) -> CrawlProfile {
  { name, agent, seed_urls, max_urls }
}

///|
pub fn profile_plan(text : String, p : CrawlProfile) -> Array[String] {
  next_batch(text, p.agent, p.seed_urls, p.max_urls)
}

///|
pub fn profile_report(text : String, p : CrawlProfile) -> String {
  let planned = profile_plan(text, p)
  "profile=" +
  p.name +
  "\nagent=" +
  p.agent +
  "\nseeds=" +
  p.seed_urls.length().to_string() +
  "\nplanned=" +
  planned.length().to_string()
}

///|
pub fn profile_markdown(text : String, p : CrawlProfile) -> String {
  "# Crawl profile: " +
  p.name +
  "\n\n" +
  fenced(profile_report(text, p)) +
  "\n\n" +
  markdown_decision_table(parse(text), p.agent, url_paths(p.seed_urls))
}

///|
pub fn url_paths(urls : Array[String]) -> Array[String] {
  let paths : Array[String] = []
  for url in urls {
    paths.push(url_path(url))
  }
  paths
}