import Foundation
import CoreLocation

public final class LocationManager: NSObject, CLLocationManagerDelegate {
    public let manager = CLLocationManager()
    var pendingCompletion: ((CLAuthorizationStatus) -> Void, CLAuthorizationStatus)?
    
    public override init() {
        super.init()
        self.manager.delegate = self
    }
    
    func requestWhenInUseAuthorization(completion: @escaping (CLAuthorizationStatus) -> Void) {
        let status = CLLocationManager.authorizationStatus()
        if status == .notDetermined {
            self.manager.requestWhenInUseAuthorization()
            self.pendingCompletion = (completion, .authorizedWhenInUse)
        } else {
            completion(status)
        }
    }
    
    func requestAlwaysAuthorization(completion: @escaping (CLAuthorizationStatus) -> Void) {
        let status = CLLocationManager.authorizationStatus()
        if status == .notDetermined {
            self.manager.requestWhenInUseAuthorization()
            self.pendingCompletion = (completion, .authorizedAlways)
        } else {
            completion(status)
        }
    }
    
    public func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        if let (pendingCompletion, _) = self.pendingCompletion {
            pendingCompletion(status)
            self.pendingCompletion = nil
        }
    }
}