import Foundation

@objc(LKAppModeManager)
public final class AppModeManager : NSObject {
    private let delegate: AppModeManagerDelegate

    public var currentAppMode: AppMode {
        return delegate.getCurrentAppMode()
    }

    public static var shared: AppModeManager!

    @objc(configureWithDelegate:)
    public static func configure(delegate: AppModeManagerDelegate) {
        shared = AppModeManager(delegate: delegate)
    }

    private init(delegate: AppModeManagerDelegate) {
        self.delegate = delegate
        super.init()
    }

    private override init() { preconditionFailure("Use init(delegate:) instead.") }

    public func setCurrentAppMode(to appMode: AppMode) {
        delegate.setCurrentAppMode(to: appMode)
    }
    
    public func setAppModeToSystemDefault() {
        delegate.setAppModeToSystemDefault()
    }
}

@objc(LKAppModeManagerDelegate)
public protocol AppModeManagerDelegate {

    func getCurrentAppMode() -> AppMode
    @objc(setCurrentAppMode:)
    func setCurrentAppMode(to appMode: AppMode)
    func setAppModeToSystemDefault()
}

@objc(LKAppMode)
public enum AppMode : Int {
    case light, dark
}

public var isSystemDefault: Bool {
    return !UserDefaults.standard.dictionaryRepresentation().keys.contains("appMode")
}

public var isLightMode: Bool {
    return AppModeManager.shared.currentAppMode == .light
}

public var isDarkMode: Bool {
    return AppModeManager.shared.currentAppMode == .dark
}

@objc public final class LKAppModeUtilities : NSObject {
    
    @objc public static var isSystemDefault: Bool {
        return !UserDefaults.standard.dictionaryRepresentation().keys.contains("appMode")
    }

    @objc public static var isLightMode: Bool {
        return AppModeManager.shared.currentAppMode == .light
    }

    @objc public static var isDarkMode: Bool {
        return AppModeManager.shared.currentAppMode == .dark
    }
}