///|
pub fn compare_agents(
  text : String,
  left_agent : String,
  right_agent : String,
  paths : Array[String],
) -> String {
  let robots = parse(text)
  let lines : Array[String] = []
  for path in paths {
    let left = decide(robots, left_agent, path).allowed
    let right = decide(robots, right_agent, path).allowed
    if left != right {
      lines.push(path + " " + bool_word(left) + " vs " + bool_word(right))
    }
  }
  if lines.is_empty() {
    "same"
  } else {
    join_lines(lines)
  }
}

///|
pub fn compare_versions(
  old_text : String,
  new_text : String,
  agent : String,
  paths : Array[String],
) -> String {
  let old = parse(old_text)
  let fresh = parse(new_text)
  let lines : Array[String] = []
  for path in paths {
    let before = decide(old, agent, path).allowed
    let after = decide(fresh, agent, path).allowed
    if before != after {
      lines.push(path + " " + bool_word(before) + " -> " + bool_word(after))
    }
  }
  if lines.is_empty() {
    "same"
  } else {
    join_lines(lines)
  }
}

///|
pub fn bool_word(value : Bool) -> String {
  if value {
    "allow"
  } else {
    "block"
  }
}

///|
pub fn decision_matrix(
  text : String,
  agents : Array[String],
  paths : Array[String],
) -> String {
  let robots = parse(text)
  let lines : Array[String] = []
  let header : Array[String] = ["path"]
  for agent in agents {
    header.push(agent)
  }
  lines.push(join_with(header, ","))
  for path in paths {
    let row : Array[String] = [path]
    for agent in agents {
      row.push(bool_word(decide(robots, agent, path).allowed))
    }
    lines.push(join_with(row, ","))
  }
  join_lines(lines)
}