import { Broadphase } from '../collision/Broadphase'
import type { AABB } from '../collision/AABB'
import type { Body } from '../objects/Body'
import type { World } from '../world/World'

/**
 * Naive broadphase implementation, used in lack of better ones.
 *
 * The naive broadphase looks at all possible pairs without restriction, therefore it has complexity N^2 _(which is bad)_
 */
export class NaiveBroadphase extends Broadphase {
  /**
   * @todo Remove useless constructor
   */
  constructor() {
    super()
  }

  /**
   * Get all the collision pairs in the physics world
   */
  collisionPairs(world: World, pairs1: Body[], pairs2: Body[]): void {
    const bodies = world.bodies
    const n = bodies.length
    let bi
    let bj

    // Naive N^2 ftw!
    for (let i = 0; i !== n; i++) {
      for (let j = 0; j !== i; j++) {
        bi = bodies[i]
        bj = bodies[j]

        if (!this.needBroadphaseCollision(bi, bj)) {
          continue
        }

        this.intersectionTest(bi, bj, pairs1, pairs2)
      }
    }
  }

  /**
   * Returns all the bodies within an AABB.
   * @param result An array to store resulting bodies in.
   */
  aabbQuery(world: World, aabb: AABB, result: Body[] = []): Body[] {
    for (let i = 0; i < world.bodies.length; i++) {
      const b = world.bodies[i]

      if (b.aabbNeedsUpdate) {
        b.updateAABB()
      }

      // Ugly hack until Body gets aabb
      if (b.aabb.overlaps(aabb)) {
        result.push(b)
      }
    }

    return result
  }
}
