import Foundation import Photos @MainActor final class BackupViewModel: ObservableObject { @Published var totalPhotoCount: Int = 0 @Published var alreadySafeCount: Int = 0 @Published var notBackedUpCount: Int = 0 @Published var photosAuthStatus: PHAuthorizationStatus = PHPhotoLibrary.authorizationStatus(for: .readWrite) private let photoService = PhotoLibraryService() private var fetchedAssets: [PhotoAsset] = [] func loadPhotoCount(filter: BackupFilter) { let assets = photoService.fetchAssets(filter: filter) fetchedAssets = assets totalPhotoCount = assets.count // Conservative initial state until NAS scan completes alreadySafeCount = 0 notBackedUpCount = assets.count } // Called after NAS directory listing loads. // Matches by lowercased filename — same heuristic BackupEngine uses for skip checks. // This gives an accurate pre-scan "Already Safe / Not Backed Up" split before // the user ever taps Start Backup. func compareWithNAS(nasItems: [NASItem]) { let nasFilenames = Set( nasItems .filter { !$0.isDirectory } .map { $0.name.lowercased() } ) var safe = 0 for asset in fetchedAssets { if nasFilenames.contains(asset.filename.lowercased()) { safe += 1 } } alreadySafeCount = safe notBackedUpCount = totalPhotoCount - safe } func requestPhotosAccess() async { photosAuthStatus = await photoService.requestAuthorization() } }