package face

// Faces represents a list of faces detected.
type Faces []Face

// Contains returns true if the face conflicts with existing faces.
func (faces Faces) Contains(other Face) bool {
	cropArea := other.CropArea()

	for _, f := range faces {
		if f.CropArea().OverlapPercent(cropArea) > OverlapThresholdFloor {
			return true
		}
	}

	return false
}

// Append adds a face.
func (faces *Faces) Append(f Face) {
	*faces = append(*faces, f)
}

// Count returns the number of faces detected.
func (faces Faces) Count() int {
	return len(faces)
}

// MaxScale returns the largest face scale in pixels.
func (faces Faces) MaxScale() (max int) {
	for _, f := range faces {
		if f.Area.Scale > max {
			max = f.Area.Scale
		}
	}

	return max
}

// Uncertainty returns the max face detection uncertainty in percent.
func (faces Faces) Uncertainty() int {
	if len(faces) < 1 {
		return 100
	}

	maxScore := 0

	for _, f := range faces {
		if f.Score > maxScore {
			maxScore = f.Score
		}
	}

	switch {
	case maxScore > 300:
		return 1
	case maxScore > 200:
		return 5
	case maxScore > 100:
		return 10
	case maxScore > 80:
		return 15
	case maxScore > 65:
		return 20
	case maxScore > 50:
		return 25
	case maxScore > 40:
		return 30
	case maxScore > 30:
		return 35
	case maxScore > 20:
		return 40
	case maxScore > 10:
		return 45
	}

	return 50
}
