import Foundation

/**
 * Key-value storage protocol for persisting SDK data
 */
internal protocol KeyValueStore {
    /**
     * Get a string value by key
     *
     * - Parameters:
     *   - key: Storage key
     *   - default: Default value if key doesn't exist
     * - Returns: Stored value or default
     */
    func getString(key: String, default: String?) -> String?

    /**
     * Store a string value
     *
     * - Parameters:
     *   - key: Storage key
     *   - value: Value to store (pass nil to remove the key)
     */
    func putString(key: String, value: String?)

    /**
     * Clear all stored data
     */
    func clear()
}

/**
 * UserDefaults-based implementation of KeyValueStore
 *
 * Thread-safe implementation using iOS's UserDefaults.
 * All keys are prefixed with "bigcrunch_ads_" for namespace isolation.
 */
internal class UserDefaultsStore: KeyValueStore {

    private let userDefaults = UserDefaults.standard
    private let keyPrefix = "bigcrunch_ads_"

    func getString(key: String, default: String? = nil) -> String? {
        let prefixedKey = keyPrefix + key
        let value = userDefaults.string(forKey: prefixedKey) ?? `default`
        if value != nil {
            BCLogger.verbose("Retrieved value for key: \(key)")
        }
        return value
    }

    func putString(key: String, value: String?) {
        let prefixedKey = keyPrefix + key
        if let value = value {
            userDefaults.set(value, forKey: prefixedKey)
            BCLogger.verbose("Stored value for key: \(key)")
        } else {
            userDefaults.removeObject(forKey: prefixedKey)
            BCLogger.verbose("Removed value for key: \(key)")
        }
    }

    func clear() {
        let keys = userDefaults.dictionaryRepresentation().keys
        let prefixedKeys = keys.filter { $0.hasPrefix(keyPrefix) }

        for key in prefixedKeys {
            userDefaults.removeObject(forKey: key)
        }

        BCLogger.debug("Cleared all stored data")
    }
}
