///|
/// Render current content to Sixel
fn Browser::render(self : Browser) -> String {
  if self.html_content.length() == 0 {
    return ""
  }
  let installed_provider = self.install_sixel_image_provider()
  let ctx = @browser_helpers.create_render_context(
    self.viewport_width,
    self.viewport_height,
    false,
  )
  let (node, layout) = self.render_graphics_node_and_layout(ctx, false)
  let output = @sixel.render_with_styles_scrolled(
    node,
    layout,
    self.viewport_width,
    self.viewport_height,
    self.scroll_y,
  )
  if installed_provider {
    @raster.clear_image_provider()
  }
  output
}

///|
/// Render current content to Kitty graphics protocol
fn Browser::render_kitty(self : Browser) -> String {
  if self.html_content.length() == 0 {
    return ""
  }
  let ctx = @browser_helpers.create_render_context(
    self.viewport_width,
    self.viewport_height,
    false,
  )
  let (node, layout) = self.render_graphics_node_and_layout(ctx, false)
  let paint_node = @tui_paint_plain.from_node_and_layout(node, layout)
  let base = @painter_terminal.render_paint_node_to_kitty_scrolled(
    paint_node,
    self.viewport_width,
    self.viewport_height,
    self.scroll_y,
  )
  self.collect_graphics_image_regions_from_node_layout(node, layout)
  let overlay = self.build_kitty_image_overlay()
  if overlay.length() > 0 {
    base + overlay
  } else {
    base
  }
}

///|
async fn[T : @io.Writer] Browser::write_kitty_output(
  self : Browser,
  writer : T,
) -> Unit {
  if self.html_content.length() == 0 {
    return
  }
  let ctx = @browser_helpers.create_render_context(
    self.viewport_width,
    self.viewport_height,
    false,
  )
  let (node, layout) = self.render_graphics_node_and_layout(ctx, false)
  let paint_node = @tui_paint_plain.from_node_and_layout(node, layout)
  @painter_terminal.write_paint_node_to_kitty_scrolled(
    writer,
    paint_node,
    self.viewport_width,
    self.viewport_height,
    self.scroll_y,
  )
  self.collect_graphics_image_regions_from_node_layout(node, layout)
  let overlay = self.build_kitty_image_overlay()
  if overlay.length() > 0 {
    writer.write(overlay) catch {
      _ => ()
    }
  }
}

///|
fn Browser::collect_graphics_image_regions_from_node_layout(
  self : Browser,
  render_node : @layout.Node,
  layout : @layout_types.Layout,
) -> Unit {
  let char_width = self.viewport_width / 8
  let char_height = self.viewport_height / 16
  let char_scroll_y = self.scroll_y / 16
  let focused_element_name = self.get_focused_element_name()
  let buffer_result = @tui.render_to_buffer(
    render_node,
    layout,
    char_width,
    char_height,
    char_scroll_y,
    focused_element_name~,
  )
  self.image_regions = buffer_result.image_regions
}