import Dependencies
import UIKit

public struct RemoteNotificationsClient {
    public var isRegistered: @Sendable () async -> Bool
    public var register: @Sendable () async -> Void
    public var unregister: @Sendable () async -> Void
}

@available(iOSApplicationExtension, unavailable)
extension RemoteNotificationsClient: DependencyKey {
    public static let liveValue = Self(
        isRegistered: { UIApplication.shared.isRegisteredForRemoteNotifications },
        register: { UIApplication.shared.registerForRemoteNotifications() },
        unregister: { UIApplication.shared.unregisterForRemoteNotifications() }
    )
}

public extension DependencyValues {
    var remoteNotifications: RemoteNotificationsClient {
        get { self[RemoteNotificationsClient.self] }
        set { self[RemoteNotificationsClient.self] = newValue }
    }
}

extension RemoteNotificationsClient: TestDependencyKey {
    public static let previewValue = Self.noop

    public static let testValue = Self(
        isRegistered: unimplemented("\(Self.self).isRegistered", placeholder: false),
        register: unimplemented("\(Self.self).register"),
        unregister: unimplemented("\(Self.self).unregister")
    )
}

public extension RemoteNotificationsClient {
    static let noop = Self(
        isRegistered: { true },
        register: {},
        unregister: {}
    )
}
