///|
/// Batch Simulation Executor and Report Runner.

///|
/// Execute Monte Carlo simulation pipeline given a SimConfig specification.
pub fn run_simulation_batch(config : SimConfig) -> String {
  let gbm = @stochastic.create_gbm(
    config.asset_price,
    config.risk_free_rate,
    config.volatility,
  )
  let times = Array::make(config.num_steps + 1, 0.0)
  let dt = config.maturity / config.num_steps.to_double()
  let mut i = 0
  while i <= config.num_steps {
    times[i] = i.to_double() * dt
    i = i + 1
  }

  let rng = @core.RngEngine::default(config.seed)
  let matrix = gbm.generate_matrix(config.num_paths, times, rng)
  let audit = @audit.AuditTrail::new(
    config.seed,
    config.num_paths,
    config.num_steps + 1,
    matrix,
  )

  let rng_pricing = @core.RngEngine::default(config.seed)
  let opt_res = @pricing.price_european_option_mc(
    @pricing.Call,
    gbm,
    config.strike_price,
    config.risk_free_rate,
    config.maturity,
    config.num_paths,
    rng_pricing,
  )

  let var_res = @risk.compute_gbm_monte_carlo_var(
    0.95,
    gbm,
    times,
    config.num_paths,
    rng_pricing,
  )

  if config.output_format == "json" {
    let sb = StringBuilder::new()
    sb.write_string("{\n")
    sb.write_string("  \"audit\": " + audit.to_json() + ",\n")
    sb.write_string(
      "  \"option_pricing\": " +
      @audit.export_option_result_json(opt_res, "European Call") +
      ",\n",
    )
    sb.write_string(
      "  \"risk\": " + @audit.export_var_result_json(var_res) + "\n",
    )
    sb.write_string("}")
    sb.to_string()
  } else {
    @audit.generate_executive_report(
      "MoonBit Financial Monte Carlo Engine", audit, opt_res, var_res,
    )
  }
}