import Foundation

extension Int {
    func formattedAsAbbreviation() -> String {
        typealias Abbrevation = (threshold: Double, divisor: Double, suffix: String)
        let abbreviations: [Abbrevation] = [
            (0, 1, ""), (1000.0, 1000.0, "K"),
            (999_999.0, 1_000_000.0, "M"), (999_999_999.0, 1_000_000_000.0, "B")
        ]

        let startValue = Double(abs(self))

        guard let nextAbbreviationIndex = abbreviations.firstIndex(where: { startValue < $0.threshold }) else {
            return String(self)
        }

        let abbreviation = abbreviations[abbreviations.index(before: nextAbbreviationIndex)]
        let formatter = NumberFormatter()

        formatter.positiveSuffix = abbreviation.suffix
        formatter.negativeSuffix = abbreviation.suffix
        formatter.allowsFloats = true
        formatter.minimumIntegerDigits = 1
        formatter.minimumFractionDigits = 0
        formatter.maximumFractionDigits = 1

        return formatter.string(from: NSNumber(value: Double(self) / abbreviation.divisor))!
    }
}