import Foundation class GIFStorageService { static let shared = GIFStorageService() private let userDefaults = UserDefaults(suiteName: "group.gifcollector") private let savedGIFsKey = "savedGIFs" private init() { // Make sure the shared UserDefaults exists if userDefaults == nil { print("Error: Could not create UserDefaults with app group") } } func saveGIF(data: Data, fromURL urlString: String, completion: @escaping (GIF?) -> Void) { // First store the GIF data to disk guard let localPath = GIFFileManager.shared.storeGIF(data: data, fromURL: urlString) else { completion(nil) return } // Create and save the GIF model let gif = GIF(localFilePath: localPath, originalURL: urlString) var savedGIFs = fetchGIFs() // Don't save duplicates of the same URL if !savedGIFs.contains(where: { $0.originalURL == urlString }) { savedGIFs.append(gif) saveToUserDefaults(gifs: savedGIFs) } // Perform cleanup if needed GIFFileManager.shared.performStorageCleanupIfNeeded() completion(gif) } func fetchGIFs() -> [GIF] { guard let data = userDefaults?.data(forKey: savedGIFsKey), let gifs = try? JSONDecoder().decode([GIF].self, from: data) else { return [] } // Filter out any GIFs whose files no longer exist let validGIFs = gifs.filter { GIFFileManager.shared.fileExists(at: $0.localFilePath) } // If we filtered any out, save the updated list if validGIFs.count != gifs.count { saveToUserDefaults(gifs: validGIFs) } return validGIFs.sorted(by: { $0.createdAt > $1.createdAt }) } func deleteGIF(with id: UUID) { var savedGIFs = fetchGIFs() // Find the GIF to delete if let gifToDelete = savedGIFs.first(where: { $0.id == id }) { // Delete the file from storage GIFFileManager.shared.deleteGIF(at: gifToDelete.localFilePath) // Remove from the list savedGIFs.removeAll(where: { $0.id == id }) saveToUserDefaults(gifs: savedGIFs) } } func clearAllGIFs() { // Delete all GIF files fetchGIFs().forEach { gif in GIFFileManager.shared.deleteGIF(at: gif.localFilePath) } // Clear the list saveToUserDefaults(gifs: []) } private func saveToUserDefaults(gifs: [GIF]) { guard let data = try? JSONEncoder().encode(gifs) else { return } userDefaults?.set(data, forKey: savedGIFsKey) } func getGIFData(for gif: GIF) -> Data? { return GIFFileManager.shared.loadGIFData(from: gif.localFilePath) } }