// Render functions for server_dom
//
// Converts Node tree to HTML string.
//

///|
/// Render a node tree to HTML string
pub fn render(node : @luna.Node[Unit, String]) -> String {
  @render.render_to_string(node).html
}

///|
/// Render a node tree to HTML with preload URLs for islands
pub fn render_with_preloads(node : @luna.Node[Unit, String]) -> RenderResult {
  let result = @render.render_to_string(node, preload=true)
  { html: result.html, preload_urls: result.preload_urls, }
}

///|
/// Render a complete HTML document with DOCTYPE
pub fn render_document(node : @luna.Node[Unit, String]) -> String {
  "\n" + render(node)
}

///|
/// Render a complete HTML document with DOCTYPE and preloads
pub fn render_document_with_preloads(
  node : @luna.Node[Unit, String],
) -> RenderResult {
  let result = render_with_preloads(node)
  {
    html: "\n" + result.html,
    preload_urls: result.preload_urls,
  }
}

///|
/// Generate modulepreload link tags for island scripts
pub fn generate_preload_tags(urls : Array[String]) -> String {
  @render.generate_preload_tags(urls)
}

///|
/// Create a basic HTML document structure
///
/// Example:
/// ```moonbit nocheck
/// document(
///   lang="en",
///   head_[
///     title("My App"),
///     meta(charset="UTF-8"),
///   ],
///   body_[
///     h1([text("Hello!")]),
///   ],
/// )
/// ```
pub fn document(
  lang? : String,
  head_children~ : Array[@luna.Node[Unit, String]],
  body_children~ : Array[@luna.Node[Unit, String]],
  body_class? : String,
  body_id? : String,
) -> @luna.Node[Unit, String] {
  let body_node = match (body_class, body_id) {
    (Some(c), Some(i)) => body(class=c, id=i, body_children)
    (Some(c), None) => body(class=c, body_children)
    (None, Some(i)) => body(id=i, body_children)
    (None, None) => body(body_children)
  }
  html(lang?, [head(head_children), body_node])
}