import Foundation

private enum TemperatureUnit {
    case celsius
    case fahrenheit
    
    var suffix: String {
        switch self {
        case .celsius:
            return "°C"
        case .fahrenheit:
            return "°F"
        }
    }
}

private var cachedTemperatureUnit: TemperatureUnit?
private func currentTemperatureUnit() -> TemperatureUnit {
    if let cachedTemperatureUnit {
        return cachedTemperatureUnit
    }
    let temperatureFormatter = MeasurementFormatter()
    temperatureFormatter.locale = Locale.current
   
    let fahrenheitMeasurement = Measurement(value: 0, unit: UnitTemperature.fahrenheit)
    let fahrenheitString = temperatureFormatter.string(from: fahrenheitMeasurement)
    
    var temperatureUnit: TemperatureUnit = .celsius
    if fahrenheitString.contains("F") || fahrenheitString.contains("Fahrenheit") {
        temperatureUnit = .fahrenheit
    }
    cachedTemperatureUnit = temperatureUnit
    return temperatureUnit
}

private var formatter: MeasurementFormatter = {
    let formatter = MeasurementFormatter()
    formatter.locale = Locale.current
    formatter.unitStyle = .short
    formatter.numberFormatter.maximumFractionDigits = 0
    return formatter
}()

public func stringForTemperature(_ value: Double) -> String {
    let valueString = formatter.string(from: Measurement(value: value, unit: UnitTemperature.celsius)).trimmingCharacters(in: CharacterSet(charactersIn: "0123456789-,.").inverted)
    return valueString + currentTemperatureUnit().suffix
}