import Combine
import ComposableArchitecture

@DependencyClient
public struct UserEventBusClient {
    public enum UserEvent {
        case signOut
    }

    public var send: (_ event: UserEvent) -> Void
    public var stream: () -> AsyncStream<UserEvent> = { .never }
}

extension UserEventBusClient: DependencyKey {
    public static var liveValue: Self {
        let subject = PassthroughSubject<UserEvent, Never>()

        return Self(
            send: { userEvent in subject.send(userEvent) },
            stream: {
                UncheckedSendable(subject
//                    .print("User Event Bus") // <--- TODO: Replace w/ OSLog https://github.com/pointfreeco/swift-composable-architecture/blob/db3ed659be1d1a08f6fc83417581583bb2337ee2/Sources/ComposableArchitecture/Internal/Logger.swift#L10
                        .values).eraseToStream()
            }
        )
    }
}

public extension DependencyValues {
    var userEventBus: UserEventBusClient {
        get { self[UserEventBusClient.self] }
        set { self[UserEventBusClient.self] = newValue }
    }
}
