import SwiftUI /// Download button for playlist headers — visible only when playlist has cloud tracks. /// Shows downloaded/total count (e.g., "↓ 2/4"). struct PlaylistDownloadButton: View { let playlist: Playlist @State private var downloadManager = DownloadManager.shared private var cloudTracks: [Track] { playlist.sortedEntries.compactMap(\.track).filter(\.isCloud) } private var downloadedCount: Int { cloudTracks.filter { $0.downloadState == .downloaded }.count } private var downloadingCount: Int { cloudTracks.filter { $0.downloadState == .downloading }.count } var body: some View { let cloud = cloudTracks if !cloud.isEmpty { Button { handleTap(cloud) } label: { Label(buttonLabel(cloud), systemImage: "arrow.down.circle") } .help(helpText(cloud)) } } private func buttonLabel(_ cloud: [Track]) -> String { let total = cloud.count if downloadedCount == total { return "↓ \(total)/\(total)" } return "↓ \(downloadedCount)/\(total)" } private func helpText(_ cloud: [Track]) -> String { let total = cloud.count if downloadedCount == total { return "All cloud tracks downloaded" } if downloadingCount > 0 { return "Downloading... tap to cancel" } return "Download \(total - downloadedCount) cloud tracks for offline playback" } private func handleTap(_ cloud: [Track]) { if downloadingCount > 0 { downloadManager.cancelBatch(tracks: cloud) } else if downloadedCount < cloud.count { downloadManager.downloadBatch(tracks: cloud, apiClient: ChadMusicAPIClient.shared) } } }