///|
pub fn print_banner() -> Unit {
  println(
    "==========================================================================",
  )
  println(
    "  MoonBit 国际贸易单证规范化与互校验库 (moonbit-tradedocs) v0.1.0",
  )
  println(
    "  MoonBit International Trade Documents Normalization & Cross-Validation",
  )
  println("  Deterministic validation toolkit for trade-document workflows")
  println(
    "==========================================================================",
  )
}

///|
pub fn print_help() -> Unit {
  print_banner()
  println("\nUsage:")
  println("  moonbit-tradedocs  [options]\n")
  println("Commands:")
  println("  check         Run document internal validation rules")
  println(
    "  cross-check             Run multi-document cross-validation engine",
  )
  println(
    "  normalize    Normalize dates, currencies, and country codes",
  )
  println(
    "  anonymize               Desensitize trade document set into test fixture",
  )
  println(
    "  demo                    Run sample international trade cross-validation demo",
  )
  println("  version                 Print tool version and build information")
  println("  help                    Print this help menu\n")
}

///|
pub fn run_demo() -> Unit {
  print_banner()
  println("\n[1/5] Constructing Sample Trade Document Set...")
  let seller = @types.Party::new(
    id="SEL-888",
    name="Shenzhen Tech Exports Ltd.",
    role=@types.PartyRole::Seller,
    tax_id=Some(
      @types.TaxIdentifier::new(
        country="CN",
        tax_id_type="VAT",
        number="91440300MA5F1234",
      ),
    ),
    address=@types.Address::new(
      street_address="High-Tech Park",
      city="Shenzhen",
      country_code="CN",
    ),
  )
  let buyer = @types.Party::new(
    id="BUY-999",
    name="Global Trading Corp",
    role=@types.PartyRole::Buyer,
    tax_id=Some(
      @types.TaxIdentifier::new(
        country="US",
        tax_id_type="EIN",
        number="12-3456789",
      ),
    ),
    address=@types.Address::new(
      street_address="100 Market St",
      city="San Francisco",
      country_code="US",
    ),
  )

  let inv_header = @types.InvoiceHeader::new(
    invoice_number="INV-2026-0811",
    invoice_date="2026-08-11",
    po_number="PO-2026-99",
    seller~,
    buyer~,
    incoterms=@types.Incoterms::FOB,
    currency=@types.CurrencyCode::USD,
  )
  let item1 = @types.LineItem::new(
    item_number="1",
    sku="SKU-MICRO-01",
    description="Microcontroller Development Board",
    hs_code=Some(@types.HSCode::from_string("8542.31.00")),
    quantity=1000.0,
    unit=@types.QuantityUnit::PCS,
    unit_price=@types.Money::new(15.0, @types.CurrencyCode::USD),
    country_of_origin="CN",
  )
  let inv_summary = @types.InvoiceSummary::new(
    subtotal=@types.Money::new(15000.0, @types.CurrencyCode::USD),
    freight=@types.Money::zero(@types.CurrencyCode::USD),
    insurance=@types.Money::zero(@types.CurrencyCode::USD),
    tax=@types.Money::zero(@types.CurrencyCode::USD),
    total_amount=@types.Money::new(15000.0, @types.CurrencyCode::USD),
  )
  let invoice = @types.CommercialInvoice::new(
    header=inv_header,
    items=[item1],
    summary=inv_summary,
  )

  println("[2/5] Running Internal Invoice Validation...")
  let inv_diags = @single.validate_commercial_invoice(invoice)
  println("  Internal Issues Count: " + inv_diags.length().to_string())

  println("[3/5] Constructing PO and Cross-Checking...")
  let po_header = @types.POHeader::new(
    po_number="PO-2026-99",
    po_date="2026-08-01",
    buyer~,
    seller~,
    currency=@types.CurrencyCode::USD,
  )
  let po_item = @types.POItem::new(
    item_number=1,
    sku="SKU-MICRO-01",
    description="Microcontroller Development Board",
    quantity=1000.0,
    unit=@types.QuantityUnit::PCS,
    unit_price=@types.Money::new(15.0, @types.CurrencyCode::USD),
  )
  let po_summary = @types.POSummary::new(
    subtotal=@types.Money::new(15000.0, @types.CurrencyCode::USD),
    tax=@types.Money::zero(@types.CurrencyCode::USD),
    total_amount=@types.Money::new(15000.0, @types.CurrencyCode::USD),
  )
  let po = @types.PurchaseOrder::new(
    header=po_header,
    items=[po_item],
    summary=po_summary,
  )

  let doc_set = @types.DocumentSet::new(
    set_id="SET-2026",
    invoice=Some(invoice),
    purchase_order=Some(po),
  )
  let report = @cross_check.validate_document_set(doc_set)

  let trust = @cross_check.evaluate_document_set_trust(doc_set, report)
  println(
    "  Document Set Trust Score: " +
    trust.score.to_string() +
    "/100 (Risk Tier: " +
    trust.risk_tier.to_string() +
    ")",
  )

  println("[4/5] Generating Diagnostic Markdown Report...")
  let md_report = report.to_markdown()
  println(md_report)

  println("[5/5] Demonstrating Anonymizer & JSON Export...")
  let anon_inv = @anonymizer.anonymize_invoice(
    invoice,
    @anonymizer.AnonymizeConfig::default(),
  )
  let json_str = @adapters.invoice_to_json(anon_inv)
  println(json_str)

  println("\n✅ Demo execution finished successfully!")
}