// FlowGate Demo — Builder + hooks
fn main {

  let gate = @lib.new_builder()
    .global(5).per_key(3).per_session(2).queue_size(10)
    .on_block(fn(reason) { println("  [EVENT] Blocked: " + reason) })
    .on_acquire(fn(key, session, msg) { println("  [EVENT] Acquired: key=" + key + " session=" + session + " " + msg) })
    .build()

  println("═══ FlowGate Demo ═══")
  println("Config: global=5 per_key=3 per_session=2 queue=10")
  println("")

  println("── normal flow ──")
  let r1 = gate.acquire("tool-a", "sess-1")
  println("  acquire tool-a/sess-1: " + r1.unwrap())
  gate.release("tool-a", "sess-1")
  println("  released tool-a")
  println("")

  println("── fill global ──")
  let _ = gate.acquire("a", "1")
  let _ = gate.acquire("b", "2")
  let _ = gate.acquire("c", "3")
  let _ = gate.acquire("d", "4")
  let _ = gate.acquire("e", "5")
  let r_full = gate.acquire("f", "6")
  match r_full {
    Ok(_) => println("  UNEXPECTED: got slot")
    Err(e) => println("  Expected: " + e)
  }
  println("")

  println("── stats ──")
  println("  " + gate.stats())
  println("  Available: " + gate.available().to_string())
  println("  Is full: " + gate.is_full().to_string())
}