@objc public protocol EventLoggingSearchSourceProviding {
    var searchSource: String { get }
}

@objc public protocol EventLoggingEventValuesProviding {
    var eventLoggingCategory: EventLoggingCategory { get }
    var eventLoggingLabel: EventLoggingLabel? { get }
}

public protocol EventLoggingStandardEventProviding {
    var standardEvent: [String: Any] { get }
}

public extension EventLoggingStandardEventProviding where Self: EventLoggingFunnel {
    var standardEvent: [String: Any] {
        guard let aii = appInstallID, let si = sessionID else {
            return ["event_dt": timestamp]
        }
        return ["app_install_id": aii, "session_id": si, "event_dt": timestamp]
    }
    
    func wholeEvent(with event: [AnyHashable: Any]) -> [String: Any] {
        guard let event = event as? [String: Any] else {
            assertionFailure("Expected dictionary with keys of type String")
            return [:]
        }
        return standardEvent.merging(event, uniquingKeysWith: { (first, _) in first })
    }
}
