internal void MessageStateChangeHandler(MessagingEventParams eventParams, MessagingEventParams.StateParams stateParams)
        {
            Message message = new Message()
            {
                Body      = stateParams.Body,
                Context   = stateParams.Context,
                Direction = stateParams.Direction,
                From      = stateParams.FromNumber,
                ID        = stateParams.MessageID,
                Media     = stateParams.Media,
                Reason    = stateParams.Reason,
                Segments  = stateParams.Segments,
                State     = stateParams.MessageState,
                Tags      = stateParams.Tags,
                To        = stateParams.ToNumber,
            };

            OnMessageStateChange?.Invoke(this, message, eventParams, stateParams);

            switch (stateParams.MessageState)
            {
            case MessageState.queued:
                OnMessageQueued?.Invoke(this, message, eventParams, stateParams);
                break;

            case MessageState.initiated:
                OnInitiated?.Invoke(this, message, eventParams, stateParams);
                break;

            case MessageState.sent:
                OnMessageSent?.Invoke(this, message, eventParams, stateParams);
                break;

            case MessageState.delivered:
                OnMessageDelivered?.Invoke(this, message, eventParams, stateParams);
                break;

            case MessageState.undelivered:
                OnMessageUndelivered?.Invoke(this, message, eventParams, stateParams);
                break;

            case MessageState.failed:
                OnMessageFailed?.Invoke(this, message, eventParams, stateParams);
                break;
            }
        }
        internal void MessageReceivedHandler(MessagingEventParams eventParams, MessagingEventParams.ReceiveParams receiveParams)
        {
            Message message = new Message()
            {
                Body      = receiveParams.Body,
                Context   = receiveParams.Context,
                Direction = receiveParams.Direction,
                From      = receiveParams.FromNumber,
                ID        = receiveParams.MessageID,
                Media     = receiveParams.Media,
                // Reason
                Segments = receiveParams.Segments,
                State    = receiveParams.MessageState,
                Tags     = receiveParams.Tags,
                To       = receiveParams.ToNumber,
            };

            OnMessageReceived?.Invoke(this, message, eventParams, receiveParams);
        }
        private void OnNotification(Client client, BroadcastParams broadcastParams)
        {
            mLogger.LogDebug("MessagingAPI OnNotification: {0}", broadcastParams.Event);

            if (broadcastParams.Event != "queuing.relay.messaging")
            {
                return;
            }

            MessagingEventParams messagingEventParams = null;

            try { messagingEventParams = broadcastParams.ParametersAs <MessagingEventParams>(); }
            catch (Exception exc)
            {
                mLogger.LogWarning(exc, "Failed to parse MessagingEventParams");
                return;
            }

            if (string.IsNullOrWhiteSpace(messagingEventParams.EventType))
            {
                mLogger.LogWarning("Received MessagingEventParams with empty EventType");
                return;
            }

            switch (messagingEventParams.EventType.ToLower())
            {
            case "messaging.state":
                OnMessagingEvent_MessageState(client, broadcastParams, messagingEventParams);
                break;

            case "messaging.receive":
                OnMessagingEvent_MessageReceive(client, broadcastParams, messagingEventParams);
                break;

            default:
                mLogger.LogDebug("Received unknown messaging EventType: {0}", messagingEventParams.EventType);
                break;
            }
        }
        private void OnMessagingEvent_MessageReceive(Client client, BroadcastParams broadcastParams, MessagingEventParams messagingEventParams)
        {
            MessagingEventParams.ReceiveParams receiveParams = null;
            try { receiveParams = messagingEventParams.ParametersAs <MessagingEventParams.ReceiveParams>(); }
            catch (Exception exc)
            {
                mLogger.LogWarning(exc, "Failed to parse ReceiveParams");
                return;
            }

            MessageReceivedHandler(messagingEventParams, receiveParams);
        }
        private void OnMessagingEvent_MessageState(Client client, BroadcastParams broadcastParams, MessagingEventParams messagingEventParams)
        {
            MessagingEventParams.StateParams stateParams = null;
            try { stateParams = messagingEventParams.ParametersAs <MessagingEventParams.StateParams>(); }
            catch (Exception exc)
            {
                mLogger.LogWarning(exc, "Failed to parse StateParams");
                return;
            }

            MessageStateChangeHandler(messagingEventParams, stateParams);
        }