///|
/// A complete OFX 1.x statement, embedded rather than read from disk: the demo
/// runs on wasm, wasm-gc, js and native, and only some of those have a file
/// system. Everything below is fictional.
let document : String = "OFXHEADER:100\nDATA:OFXSGML\nVERSION:102\nSECURITY:NONE\nENCODING:USASCII\nCHARSET:1252\nCOMPRESSION:NONE\nOLDFILEUID:NONE\nNEWFILEUID:NONE\n\n\n\n\n20260927090000\n\n\n\n\n\nEUR\n\n111000025\n0001\ndemo-42\nCHECKING\n\n\n20260901\n20260930\n\nDEBIT\n20260924120000[-5:EST]\n-42.50\ndemo-1\nGrocer & Co\nweekly shop\n\n\nCHECK\n20260925103000[+5.5:IST]\n20260920\n-125.00\ndemo-2\n1042\n5411\nSupermarket\n\n\nCREDIT\n20260926000000\n100.00\ndemo-3\nRefund & adjustment\n\n\nDEBIT\n20260926120000\n12.3.4\ndemo-4\n\n\n\n\n\n"

///|
fn main {
  let report = @ofx.parse_statement(document)
  println("Header: " + report.header.render())
  println(
    "Format: " +
    (if report.header.is_xml() { "OFX 2.x XML" } else { "OFX 1.x SGML" }),
  )
  println(
    "Account: " +
    report.bank_id +
    "/" +
    report.branch_id +
    " " +
    report.account_type +
    " " +
    report.account_id +
    " in " +
    report.currency,
  )
  println("Period: " + report.start_date + " .. " + report.end_date)
  println("")
  println("Transactions (" + report.transactions.length().to_string() + "):")
  for transaction in report.transactions {
    let direction = transaction.direction().to_string()
    let utc = match transaction.utc_posted() {
      Some(stamp) => stamp
      None => "invalid-date"
    }
    let minor = match transaction.amount_minor_units(2) {
      Some(units) => units.to_string()
      None => "not-representable"
    }
    println(
      "  " +
      transaction.fitid +
      "  " +
      direction.pad_end(6, ' ') +
      " " +
      transaction.amount.pad_start(9, ' ') +
      " -> " +
      minor.pad_start(9, ' ') +
      " UTC " +
      utc +
      "  " +
      transaction.name,
    )
  }
  println("")
  println(
    "Diagnostics (" +
    report.diagnostics.length().to_string() +
    ", errors " +
    report.error_count().to_string() +
    ", warnings " +
    report.warning_count().to_string() +
    "):",
  )
  for diagnostic in report.render_diagnostics() {
    println("  " + diagnostic)
  }
  println("")
  if report.ok() {
    println("Importable. Review the warnings before writing to a ledger.")
  } else {
    println("Rejected: fix the errors above, then parse again.")
  }
  let document = @ofx.parse_document(document)
  println("")
  println(
    "parse_document sees " +
    document.statement_count().to_string() +
    " statement(s), " +
    document.account_labels().join(", "),
  )
  println("CSV export (account and currency lead every row):")
  println(document.to_csv())
}