import { BoundingBox } from '../BoundingBox';
import { iou } from '../iou';

export function nonMaxSuppression(
  boxes: BoundingBox[],
  scores: number[],
  iouThreshold: number,
  isIOU: boolean = true
): number[] {

  let indicesSortedByScore = scores
    .map((score, boxIndex) => ({ score, boxIndex }))
    .sort((c1, c2) => c1.score - c2.score)
    .map(c => c.boxIndex)

  const pick: number[] = []

  while(indicesSortedByScore.length > 0) {
    const curr = indicesSortedByScore.pop() as number
    pick.push(curr)

    const indices = indicesSortedByScore

    const outputs: number[] = []
    for (let i = 0; i < indices.length; i++) {
      const idx = indices[i]

      const currBox = boxes[curr]
      const idxBox = boxes[idx]

      outputs.push(iou(currBox, idxBox, isIOU))
    }

    indicesSortedByScore = indicesSortedByScore.filter(
      (_, j) => outputs[j] <= iouThreshold
    )
  }

  return pick

}