// Copyright 2026 Aurum Authors
// Licensed under Apache-2.0

///|
/// Aurum 命令行演示:货币时间价值、资本预算、贷款摊销、固定资产折旧、
/// 债券定价、财务比率与多币种换算。
fn main {
  println("Aurum 财务计算演示")
  println("====================")

  // 货币时间价值
  println("【货币时间价值】")
  let rate = 0.05
  match @tvm.future_value(10000.0, rate, 10) {
    Some(value) =>
      println(
        "  本金 10000 元、年利率 5%、10 年的终值 = " +
        value.to_string(),
      )
    None => println("  终值无法计算")
  }
  match @tvm.present_value_annuity(1000.0, 0.05, 20) {
    Some(value) =>
      println(
        "  每期 1000 元、20 期普通年金的现值 = " + value.to_string(),
      )
    None => println("  年金现值无法计算")
  }
  match @tvm.effective_annual_rate(0.12, 12) {
    Some(value) =>
      println(
        "  名义年利率 12%、每年复利 12 次的有效年利率 = " +
        value.to_string(),
      )
    None => println("  有效年利率无法计算")
  }

  // 资本预算
  println("【资本预算】")
  let cashflows = [-1000.0, 300.0, 400.0, 500.0]
  let discount = 0.10
  match @capital.net_present_value(discount, cashflows) {
    Some(value) =>
      println(
        "  现金流 [-1000, 300, 400, 500] 折现率 10% 的 NPV = " +
        value.to_string(),
      )
    None => println("  NPV 无法计算")
  }
  match @capital.internal_rate_of_return(cashflows) {
    Some(value) => println("  唯一 IRR = " + value.to_string())
    None => println("  唯一 IRR 无法确定")
  }
  match @capital.net_present_value(0.0, [1.0e16, 1.0, -1.0e16]) {
    Some(value) =>
      println(
        "  大小相差 16 个数量级的抵消现金流,NPV = " +
        value.to_string(),
      )
    None => println("  抵消现金流 NPV 无法计算")
  }

  // 贷款摊销
  println("【贷款摊销】")
  match @amortize.equal_installment_payment(10000.0, 0.01, 12) {
    Some(value) =>
      println(
        "  本金 10000 元、月利率 1%、12 期等额本息月供 = " +
        value.to_string(),
      )
    None => println("  月供无法计算")
  }
  match @amortize.total_interest_equal_installment(10000.0, 0.01, 12) {
    Some(value) => println("  等额本息总利息 = " + value.to_string())
    None => println("  总利息无法计算")
  }

  // 固定资产折旧
  println("【固定资产折旧】")
  match @wear.straight_line_depreciation(10000.0, 1000.0, 5) {
    Some(value) =>
      println(
        "  成本 10000、残值 1000、5 年直线法年折旧 = " +
        value.to_string(),
      )
    None => println("  折旧无法计算")
  }
  match @wear.sum_of_years_digits_depreciation(10000.0, 1000.0, 5, 1) {
    Some(value) =>
      println("  年数总和法第 1 年折旧 = " + value.to_string())
    None => println("  折旧无法计算")
  }

  // 债券定价
  println("【债券定价】")
  match @bond.price(50.0, 1000.0, 0.05, 10) {
    Some(value) =>
      println(
        "  票息 50、面值 1000、收益率 5%、10 期债券价格 = " +
        value.to_string(),
      )
    None => println("  价格无法计算")
  }
  match @bond.yield_to_maturity(1000.0, 50.0, 1000.0, 10) {
    Some(value) =>
      println("  平价债券到期收益率 = " + value.to_string())
    None => println("  到期收益率无法确定")
  }

  // 财务比率
  println("【财务比率】")
  match @ratio.current_ratio(1000.0, 500.0) {
    Some(value) => println("  流动比率 = " + value.to_string())
    None => println("  流动比率无法计算")
  }
  match @ratio.return_on_equity(100.0, 500.0) {
    Some(value) => println("  净资产收益率 ROE = " + value.to_string())
    None => println("  ROE 无法计算")
  }

  // 多币种换算
  println("【多币种换算】")
  let cny = match @money.Money::parse("100.00", "CNY") {
    Some(value) => value
    None => abort("demo amount must parse")
  }
  match cny.allocate_by_weights([1, 2, 3]) {
    Some(shares) =>
      println(
        "  100.00 CNY 按 1:2:3 分摊 = " +
        shares[0].format() +
        " / " +
        shares[1].format() +
        " / " +
        shares[2].format(),
      )
    None => println("  金额分摊失败")
  }
  match @currency.convert(cny, "USD", 0.14) {
    Some(usd) => {
      println(
        "  100.00 CNY 按调用方汇率 0.14 换算 = " + usd.format() + " USD",
      )
      match
        @amortize.equal_installment_money_schedule(
          usd,
          0.05,
          1,
          @money.round_half_up(),
        ) {
        Some(rows) =>
          match @amortize.summarize_money_schedule(rows) {
            Some(summary) =>
              println(
                "  以 " +
                usd.format() +
                " USD 为本金,单期利率 5%:按分舍入还款 " +
                summary.payments.format() +
                " USD;期末余额 " +
                summary.ending_balance.format(),
              )
            None => println("  还款计划对账失败")
          }
        None => println("  单期贷款无法计算")
      }
    }
    None => println("  换算失败")
  }
  if @currency.convert(cny, "USD", 0.0) == None {
    println("  零汇率:换算返回 None")
  }
  if @capital.payback_period([-100.0, 20.0, 30.0]) == None {
    println("  现金流在给定期限内未回收:回收期返回 None")
  }
}