///|
fn write_line(builder : StringBuilder, line : String) -> Unit {
  builder.write_string(line)
  builder.write_string("\n")
}

///|
fn render_summary(builder : StringBuilder, report : DoctorReport) -> Unit {
  write_line(builder, "Moon Doctor report")
  write_line(builder, "Project: " + report.root)
  write_line(builder, "Profile: " + report.profile)
  write_line(builder, "Conclusion: " + report.conclusion())
  write_line(
    builder,
    "Grade: " + report.score.grade + " (" + report.score.status + ")",
  )
  write_line(
    builder,
    "Findings: " +
    "\{report.score.errors} error(s), " +
    "\{report.score.warnings} warning(s), " +
    "\{report.score.infos} info item(s)",
  )
}

///|
fn render_diagnostics(
  builder : StringBuilder,
  diagnostics : Array[Diagnostic],
) -> Unit {
  write_line(builder, "")
  write_line(builder, "Diagnostics")
  if diagnostics.length() == 0 {
    write_line(builder, "- No findings.")
  } else {
    for item in diagnostics {
      write_line(
        builder,
        "- [" + item.severity.label() + "] " + item.code + ": " + item.message,
      )
      if item.detail.length() > 0 {
        write_line(builder, "  " + item.detail)
      }
      match item.location {
        Some(location) =>
          write_line(
            builder,
            "  Location: " + location.path + ":" + "\{location.line}",
          )
        None => ()
      }
      if item.remediation.length() > 0 {
        write_line(builder, "  Suggested fix: " + item.remediation.join(" "))
      }
    }
  }
}

///|
fn render_next_steps(
  builder : StringBuilder,
  checklist : Array[String],
) -> Unit {
  write_line(builder, "")
  write_line(builder, "Suggested validation")
  write_line(builder, "- moon check")
  write_line(builder, "- moon test")
  write_line(builder, "")
  write_line(builder, "Release checklist")
  for item in checklist {
    write_line(builder, "- " + item)
  }
}

///|
/// Render a report as plain text for terminals, CI logs, and README examples.
pub fn render_report(report : DoctorReport) -> String {
  let builder = StringBuilder()
  render_summary(builder, report)
  render_diagnostics(builder, report.diagnostics)
  render_next_steps(builder, report.checklist)
  builder.to_string()
}