///|
fn main {
  println("==================================================")
  println(
    "   MoonSim 确定性离散事件仿真示例:多窗口银行排队系统   ",
  )
  println("==================================================")

  let sim = @moonsim.Simulation::new()
  let teller = sim.create_resource("柜员窗口", 2)
  let queue_summary = sim.create_summary("排队人数均值", 0.0)
  let sla_monitor = @stats.SlaMonitor::new("服务满意度(等待<5s)", 5.0)

  let mut customer_id = 1

  let steps : Array[(@event.ProcessContext) -> Double?] = [
    fn(ctx : @event.ProcessContext) -> Double? {
      if customer_id <= 8 {
        let cid = customer_id
        customer_id = customer_id + 1
        let arrival_time = ctx.clock.now_seconds()
        println(
          "[\{arrival_time}s] 顾客 #\{cid} 进入银行,当前窗口可用数: \{teller.available()},排队人数: \{teller.queue_length()}",
        )

        queue_summary.update(
          arrival_time,
          Double::from_int(teller.queue_length()),
        )

        let _ = teller.request(1, 10, fn(ok : Bool) {
          if ok {
            let start_time = ctx.clock.now_seconds()
            let wait_time = start_time - arrival_time
            let _ = sla_monitor.record(wait_time)
            println(
              "[\{start_time}s] 顾客 #\{cid} 开始办理业务,已等待 \{wait_time}s",
            )

            let _ = sim.schedule(4.0, 10, fn() {
              let end_time = sim.now()
              teller.release(1)
              queue_summary.update(
                end_time,
                Double::from_int(teller.queue_length()),
              )
              println(
                "[\{end_time}s] 顾客 #\{cid} 业务完成离开,释放窗口。",
              )
            })
          }
        })
        queue_summary.update(
          arrival_time,
          Double::from_int(teller.queue_length()),
        )
        Some(1.5)
      } else {
        None
      }
    },
  ]

  let gen_id = sim.register_process("顾客生成器", steps)
  let _ = sim.start_process(gen_id, 0.0, 10)

  sim.run_until(30.0)

  println("\n==================================================")
  println("                  仿真统计报告                     ")
  println("==================================================")
  println("仿真总虚拟时间: \{sim.now()}s")
  println("时间加权平均排队人数: \{queue_summary.mean()}")
  println("排队人数峰值: \{queue_summary.max()}")
  println("业务处理总人次: \{sla_monitor.total()}")
  println("等待超时(>5s)人次: \{sla_monitor.violations()}")
  println("SLA达标率: \{(1.0 - sla_monitor.violation_rate()) * 100.0}%")
  println("==================================================\n")
}