///|
fn print_result(result : @ledgerweave.ReconciliationResult) -> Unit {
  println(@ledgerweave.render_summary(result))
  println("")
  println(@ledgerweave.render_balances(result))
  println(@ledgerweave.render_findings(result))
}

///|
async fn main {
  let argv = @env.args()
  let args = argv[1:]
  if args.length() == 0 || args[0] == "demo" {
    print_result(
      @ledgerweave.reconcile(
        @ledgerweave.demo_input(),
        @ledgerweave.default_policy(),
        40,
      ),
    )
    return
  }
  if args.length() != 5 {
    println(
      "usage: ledgerweave     ",
    )
    println("or:    ledgerweave demo")
    return
  }
  let orders = @fs.read_file(args[0]).text()
  let payments = @fs.read_file(args[1]).text()
  let refunds = @fs.read_file(args[2]).text()
  let adjustments = @fs.read_file(args[3]).text()
  let day = @ledgerweave.parse_day(args[4])
  let input = @ledgerweave.parse_ledger_csv(
    orders, payments, refunds, adjustments,
  )
  print_result(
    @ledgerweave.reconcile(input, @ledgerweave.default_policy(), day),
  )
}