use std::io::Write;
use crate::engine::analyzer::AnalysisResult;
use crate::report::txt::sanitize_control;
const HEADER: &str = "host,export,finding_id,title,severity,description,evidence,remediation";
pub(crate) fn render(results: &[AnalysisResult], out: &mut dyn Write) -> anyhow::Result<()> {
writeln!(out, "{HEADER}")?;
for result in results {
for finding in &result.findings {
let export = finding.export.as_deref().unwrap_or("");
writeln!(out, "{},{},{},{},{},{},{},{}", csv_field(&result.host), csv_field(export), csv_field(&finding.id), csv_field(&finding.title), csv_field(&format!("{:?}", finding.severity)), csv_field(&finding.description), csv_field(&finding.evidence), csv_field(&finding.remediation))?;
}
}
Ok(())
}
fn csv_field(value: &str) -> String {
let value = sanitize_control(value);
let guarded = if value.starts_with(['=', '+', '-', '@', '\t', '\r']) { format!("'{value}") } else { value };
let escaped = guarded.replace('"', "\"\"");
format!("\"{escaped}\"")
}