import Combine
import Dependencies
import PhotosUI
import UIKit

public struct PhotoLibraryClient {
    public var requestAuthorization: () async -> PHAuthorizationStatus
    public var authorizationStatus: () -> PHAuthorizationStatus

    // Used when saving to Photos for Download and TikTok Share destinations
    public var requestAuthorizationAddOnly: () async -> PHAuthorizationStatus
    public var authorizationStatusAddOnly: () -> PHAuthorizationStatus

    // Combined permission check for saving to Photos
    public var canSaveToPhotoLibrary: () -> Bool
}

extension PhotoLibraryClient: DependencyKey {
    public static let liveValue = Self(
        requestAuthorization: {
            await PHPhotoLibrary.requestAuthorization(for: .readWrite)
        },
        authorizationStatus: {
            PHPhotoLibrary.authorizationStatus(for: .readWrite)
        },
        requestAuthorizationAddOnly: {
            await PHPhotoLibrary.requestAuthorization(for: .addOnly)
        },
        authorizationStatusAddOnly: {
            PHPhotoLibrary.authorizationStatus(for: .addOnly)
        },
        canSaveToPhotoLibrary: {
            PHPhotoLibrary.authorizationStatus(for: .readWrite) == .authorized || PHPhotoLibrary.authorizationStatus(for: .addOnly) == .authorized
        }
    )
}
