///|
/// Converts a palette and scene metrics into a stable key-value report.
pub fn palette_report(palette : Palette) -> String {
  let builder = StringBuilder()
  builder.write_string("palette=")
  builder.write_string(palette.name)
  builder.write_string("\ncolors=")
  builder.write_string(palette.colors.length().to_string())
  builder.write_string("\n")
  for i in 0.. String {
  "elements=\{metrics.element_count}\noccupied_area=\{metrics.occupied_area}\npath_length=\{metrics.path_length}\ndensity=\{metrics.density}\nbounds=\{metrics.bounds.x},\{metrics.bounds.y},\{metrics.bounds.width},\{metrics.bounds.height}\n"
}

///|
pub fn benchmark_csv(results : Array[BenchmarkResult]) -> String {
  let builder = StringBuilder()
  builder.write_string("name,iterations,output_size,checksum\n")
  for result in results {
    builder.write_string(
      "\{result.name},\{result.iterations},\{result.output_size},\{result.checksum}\n",
    )
  }
  builder.to_string()
}

///|
pub fn point_list_csv(points : Array[Vec2]) -> String {
  let builder = StringBuilder()
  builder.write_string("x,y\n")
  for point in points {
    builder.write_string("\{point.x},\{point.y}\n")
  }
  builder.to_string()
}

///|
pub fn rect_list_csv(rectangles : Array[Rect]) -> String {
  let builder = StringBuilder()
  builder.write_string("x,y,width,height\n")
  for rect in rectangles {
    builder.write_string("\{rect.x},\{rect.y},\{rect.width},\{rect.height}\n")
  }
  builder.to_string()
}

///|
pub fn svg_data_uri(svg : String) -> String {
  let encoded = svg
    .replace(old="#", new="%23")
    .replace(old="<", new="%3C")
    .replace(old=">", new="%3E")
    .replace(old="\n", new="%0A")
  "data:image/svg+xml," + encoded
}

///|
pub fn html_preview(document : SvgDocument, title : String) -> String {
  "\{escape_svg(title)}\{document.to_svg_string()}"
}