//! What MAIN computes for each books dir: verify, the canonical report
//! snapshot, and every record as replayed. Written to
/expected.json.
fn main() {
let root = std::path::PathBuf::from(std::env::args().nth(1).unwrap());
let mut names: Vec<_> = std::fs::read_dir(&root).unwrap().map(|e| e.unwrap().path()).filter(|p| p.is_dir()).collect();
names.sort();
for dir in names {
let n = dir.file_name().unwrap().to_string_lossy().to_string();
let _ = std::fs::remove_file(dir.join(ledger_store::DB_FILE));
let s = match ledger_store::Store::open(&dir) { Ok(s) => s, Err(e) => { println!("FAILS {n}: {e}"); continue } };
let l = s.ledger();
let entries: Vec<_> = (1..l.next_entry_id()).filter_map(|id| l.get_entry(id)).collect();
let parties: Vec<_> = (1..l.next_entry_id()).map(|id| (id, l.entry_parties(id))).filter(|(_, p)| !p.is_empty()).collect();
let v = serde_json::json!({
"verify": s.verify().map(|_| ()).map_err(|e| e.to_string()),
"snapshot": ledger_core::reports::snapshot(l).map_err(|e| e.to_string()),
"entries": entries,
"assets": l.registered_assets().collect::>(),
"periods": l.list_periods(),
"schedules": l.schedules().collect::>(),
"recurring": l.recurring_entries().collect::>(),
"invoices": l.invoices(),
"bills": l.bills(),
"payroll_runs": l.list_payroll_runs(),
"entry_parties": parties,
});
// Pretty for a reader; one line for books of many entries.
let text = if entries.len() > 100 { serde_json::to_string(&v) } else { serde_json::to_string_pretty(&v) };
std::fs::write(dir.join("expected.json"), text.unwrap() + "\n").unwrap();
println!("EXPECTED {n}: verify={}", v["verify"]);
}
}