//
//  AnagogPersistentStorage.swift
//
//  Copyright © 2024 Anagog Ltd. All rights reserved.
//

import Foundation

protocol PersistentStorageProtocol {
    func set(_ value: Int, forKey key: PersistentStorageKey)
    func set(_ value: Float, forKey key: PersistentStorageKey)
    func set(_ value: Double, forKey key: PersistentStorageKey)
    func set(_ value: Bool, forKey key: PersistentStorageKey)
    func set(_ value: Any?, forKey key: PersistentStorageKey)
    func string(forKey key: PersistentStorageKey) -> String?
    func integer(forKey key: PersistentStorageKey) -> Int
    func float(forKey key: PersistentStorageKey) -> Float
    func double(forKey key: PersistentStorageKey) -> Double
    func bool(forKey key: PersistentStorageKey) -> Bool
    func object(forKey key: PersistentStorageKey) -> Any?
}

enum PersistentStorageKey {
    case isStartupAllowedKey
    case custom(String)
    
    var rawValue: String {
        switch self {
        case .isStartupAllowedKey:
            return "is-startup-allowed"
        case .custom(let customString):
            return customString
        }
    }
}

class PersistentStorage: PersistentStorageProtocol {
    private let keyPrefix = "com.anagog.plugin."
    
    private let userDefaults: UserDefaults
    
    init(userDefaults: UserDefaults) {
        self.userDefaults = userDefaults
    }
    
    func set(_ value: Int, forKey key: PersistentStorageKey) {
        userDefaults.set(value, forKey: keyPrefix + key.rawValue)
    }
    
    func set(_ value: Float, forKey key: PersistentStorageKey) {
        userDefaults.set(value, forKey: keyPrefix + key.rawValue)
    }
    
    func set(_ value: Double, forKey key: PersistentStorageKey) {
        userDefaults.set(value, forKey: keyPrefix + key.rawValue)
    }
    
    func set(_ value: Bool, forKey key: PersistentStorageKey) {
        userDefaults.set(value, forKey: keyPrefix + key.rawValue)
    }
    
    func set(_ value: Any?, forKey key: PersistentStorageKey) {
        userDefaults.set(value, forKey: keyPrefix + key.rawValue)
    }
    
    func string(forKey key: PersistentStorageKey) -> String? {
        userDefaults.string(forKey: keyPrefix + key.rawValue)
    }
    
    func integer(forKey key: PersistentStorageKey) -> Int {
        userDefaults.integer(forKey: keyPrefix + key.rawValue)
    }
    
    func float(forKey key: PersistentStorageKey) -> Float {
        userDefaults.float(forKey: keyPrefix + key.rawValue)
    }
    
    func double(forKey key: PersistentStorageKey) -> Double {
        userDefaults.double(forKey: keyPrefix + key.rawValue)
    }
    
    func bool(forKey key: PersistentStorageKey) -> Bool {
        userDefaults.bool(forKey: keyPrefix + key.rawValue)
    }
    
    func object(forKey key: PersistentStorageKey) -> Any? {
        userDefaults.object(forKey: keyPrefix + key.rawValue)
    }
}
