//
//  LNUserDefaults.swift
//  Lanu
//
//  Created by OneeChan on 2025/11/6.
//

import Foundation

var LNUserDefaults: LNUserDefaultsManager {
    LNUserDefaultsManager.shared
}

class LNUserDefaultsManager {
    static let shared = LNUserDefaultsManager()
    private init() {}
    
    // 内存缓存容器
    private var cache: [String: Any] = [:]
    private let lock = NSLock()
    
    private let userDefaults: UserDefaults = {
        return .standard
    }()
    
    
    subscript<T: Codable>(_ key: LNUserDefaultsKey, _ defaultValue: T) -> T {
        value(forKey: key) ?? defaultValue
    }
    
    subscript<T: Codable>(_ key: LNUserDefaultsKey) -> T? {
        get {
            value(forKey: key) ?? nil
        }
        set {
            save(newValue, forKey: key)
        }
    }
    
    /// 存储数据（自动编码）
    private func save<T: Codable>(_ value: T, forKey key: LNUserDefaultsKey) {
        do {
            let data = try JSONEncoder().encode(value)
            userDefaults.set(data, forKey: key.rawValue)
            // 更新缓存
            lock.lock()
            cache[key.rawValue] = value
            lock.unlock()
        } catch {
            Log.e("存储失败（key: \(key)）：\(error)")
        }
    }
    
    /// 读取数据（自动推断类型，无需显式传递 Type.self）
    private func value<T: Codable>(forKey key: LNUserDefaultsKey) -> T? {
        // 优先从缓存读取
        lock.lock()
        defer {
            lock.unlock()
        }
        
        if let cached = cache[key.rawValue] as? T {
            return cached
        }
        
        // 从 UserDefaults 读取并解码
        guard let data = userDefaults.data(forKey: key.rawValue) else {
            cache.removeValue(forKey: key.rawValue) // 清除无效缓存
            return nil
        }
        
        do {
            let decoded = try JSONDecoder().decode(T.self, from: data)
            // 缓存解码后的数据
            cache[key.rawValue] = decoded
            return decoded
        } catch {
            Log.e("读取失败（key: \(key.rawValue)）：\(error)")
            
            cache.removeValue(forKey: key.rawValue)
            return nil
        }
    }
    
    // 辅助方法：删除数据
    func remove(forKey key: LNUserDefaultsKey) {
        userDefaults.removeObject(forKey: key.rawValue)
        lock.lock()
        cache.removeValue(forKey: key.rawValue)
        lock.unlock()
    }
    
    // 辅助方法：清除所有数据（包括缓存）
    func clearAll() {
        userDefaults.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
        lock.lock()
        cache.removeAll()
        lock.unlock()
    }
    
    // 辅助方法：仅清除内存缓存
    func clearCache() {
        lock.lock()
        cache.removeAll()
        lock.unlock()
    }
}
