///|
/// Performance benchmarks for MoonCollider. Run with `moon run cmd/bench`.
/// Measures narrowphase, broadphase, and full world-step throughput.
fn main {
  let bench = @bench.Bench::Bench()
  // --- Narrowphase: 1000 circle-circle collisions ---
  let circles : Array[@mooncollider.Shape] = []
  let mut i = 0
  while i < 1000 {
    let x = i.to_double() * 0.5
    circles.push(
      @mooncollider.Shape::from_circle(
        @mooncollider.Circle::new(@mooncollider.Vec2::new(x, 0.0), 1.0),
      ),
    )
    i = i + 1
  }
  bench.bench(
    name="narrowphase_1000_circle_pairs",
    fn() {
      let mut total = 0
      let mut k = 0
      while k < 999 {
        let m = @mooncollider.collide(circles[k], circles[k + 1])
        if m.colliding() {
          total += 1
        }
        k = k + 1
      }
      ignore(total)
    },
    count=100,
  )
  // --- Broadphase: GridHash with 500 bodies ---
  let grid = @mooncollider.GridHash::new(2.0)
  let mut j = 0
  while j < 500 {
    grid.insert(
      j,
      @mooncollider.AABB::new(
        @mooncollider.Vec2::new(j.to_double() * 0.3, j.to_double() * 0.2),
        @mooncollider.Vec2::new(0.5, 0.5),
      ),
    )
    j = j + 1
  }
  bench.bench(
    name="broadphase_gridhash_500_pairs",
    fn() { ignore(grid.pairs()) },
    count=100,
  )
  // --- World step: 100 bodies ---
  let world = @mooncollider.World::new()
  let _ = world.add_body(
    @mooncollider.BodyDef::static_(
      @mooncollider.Vec2::new(0.0, 0.0),
      @mooncollider.Shape::from_aabb(
        @mooncollider.AABB::from_min_max(
          @mooncollider.Vec2::new(-50.0, -1.0),
          @mooncollider.Vec2::new(50.0, 0.0),
        ),
      ),
    ),
  )
  let mut b = 0
  while b < 99 {
    let _ = world.add_body(
      @mooncollider.BodyDef::dynamic(
        @mooncollider.Vec2::new(
          b.to_double() * 0.3 - 15.0,
          1.0 + (b % 10).to_double(),
        ),
        @mooncollider.Shape::from_circle(
          @mooncollider.Circle::new(@mooncollider.Vec2::zero(), 0.3),
        ),
        1.0,
        0.3,
      ),
    )
    b = b + 1
  }
  bench.bench(
    name="world_step_100_bodies",
    fn() { world.step(0.016) },
    count=100,
  )
  println(bench.dump_summaries())
  println("done")
}