private async Task <Activity> ConvertToActivity(InfobipIncomingResult response)
        {
            if (response.Error != null)
            {
                //error codes - https://dev-old.infobip.com/getting-started/response-status-and-error-codes
                if (response.Error.Id > 0)
                {
                    throw new Exception($"{response.Error.Name} {response.Error.Description}");
                }
            }

            if (response.IsDeliveryReport())
            {
                _logger.Log(LogLevel.Debug, $"Received DLR notification: MessageId={response.MessageId}, " +
                            $"DoneAt={response.DoneAt}, SentAt={response.SentAt}");

                var activity = new Activity
                {
                    Type         = ActivityTypes.Event,
                    Id           = response.MessageId,
                    Name         = InfobipReportTypes.DELIVERY,
                    Timestamp    = response.DoneAt,
                    ChannelId    = InfobipConstants.ChannelName,
                    Conversation = new ConversationAccount {
                        Id = response.To
                    },
                    From = new ChannelAccount {
                        Id = _adapterOptions.InfobipWhatsAppNumber
                    },
                    Recipient = new ChannelAccount {
                        Id = response.To
                    },
                    Text        = null,
                    ChannelData = response,
                    Entities    = new List <Entity>()
                };

                if (!string.IsNullOrWhiteSpace(response.CallbackData))
                {
                    var serialized = JsonConvert.DeserializeObject <Dictionary <string, string> >(response.CallbackData);
                    activity.Entities.Add(new InfobipCallbackData(serialized));
                }

                return(activity);
            }

            if (response.IsSeenReport())
            {
                _logger.Log(LogLevel.Debug, $"Received SEEN notification: MessageId={response.MessageId}, " +
                            $"SeenAt={response.SeenAt}, SentAt={response.SentAt}");

                return(new Activity
                {
                    Type = ActivityTypes.Event,
                    Id = response.MessageId,
                    Name = InfobipReportTypes.SEEN,
                    Timestamp = response.SeenAt,
                    ChannelId = InfobipConstants.ChannelName,
                    Conversation = new ConversationAccount {
                        Id = response.To
                    },
                    From = new ChannelAccount {
                        Id = response.From
                    },
                    Recipient = new ChannelAccount {
                        Id = response.To
                    },
                    Text = null,
                    ChannelData = response
                });
            }

            if (response.IsMessage())
            {
                _logger.Log(LogLevel.Debug, $"MO message received: MessageId={response.MessageId}, " +
                            $"IntegrationType={response.IntegrationType}, " +
                            $"receivedAt={response.ReceivedAt}");

                // handle any type of WA message sent by subscriber, can be: TEXT, IMAGE, DOCUMENT, LOCATION, CONTACT, VIDEO
                // - https://dev-old.infobip.com/whatsapp-business-messaging/incoming-whatsapp-messages
                return((Activity) await ConvertMessageToMessageActivity(response));
            }

            throw new Exception("Unsupported message received - not DLR, SEEN or MO message: \n" +
                                JsonConvert.SerializeObject(response, Formatting.Indented));
        }
        private async Task <Activity> ConvertToActivity(InfobipIncomingResult response)
        {
            if (response.Error != null)
            {
                //error codes - https://dev-old.infobip.com/getting-started/response-status-and-error-codes
                if (response.Error.Id > 0)
                {
                    throw new Exception($"{response.Error.Name} {response.Error.Description}");
                }
            }

            if (response.IsDeliveryReport())
            {
                _logger.Log(LogLevel.Debug, $"Received DLR notification: MessageId={response.MessageId}, " +
                            $"DoneAt={response.DoneAt}, SentAt={response.SentAt}, Channel={response.Channel}");

                var activity = InfobipDeliveryReportToActivity.Convert(response, _adapterOptions);
                if (string.IsNullOrEmpty(activity.ChannelId))
                {
                    _logger.Log(LogLevel.Error, $"{response.Channel} is not supported channel");
                }
                HandleCallbackData(response, activity);

                return(activity);
            }

            if (response.IsSeenReport())
            {
                _logger.Log(LogLevel.Debug, $"Received SEEN notification: MessageId={response.MessageId}, " +
                            $"SeenAt={response.SeenAt}, SentAt={response.SentAt}");

                return(InfobipSeenReportToActivity.Convert(response));
            }

            if (response.IsSmsMessage())
            {
                _logger.Log(LogLevel.Debug, $"MO message received: MessageId={response.MessageId}, " +
                            $"IntegrationType=SMS, " +
                            $"receivedAt={response.ReceivedAt}");

                var activity = InfobipSmsToActivity.Convert(response);
                HandleCallbackData(response, activity);

                return(activity);
            }

            if (response.IsWhatsAppMessage())
            {
                _logger.Log(LogLevel.Debug, $"MO message received: MessageId={response.MessageId}, " +
                            $"IntegrationType={response.IntegrationType}, " +
                            $"receivedAt={response.ReceivedAt}");

                var activity = await InfobipWhatsAppToActivity.Convert(response, _infobipClient);

                if (activity == null)
                {
                    _logger.Log(LogLevel.Information, $"Received MO message: {response.MessageId} has unsupported message type");
                    return(null);
                }

                HandleCallbackData(response, activity);

                return(activity);
            }

            throw new Exception("Unsupported message received - not DLR, SEEN or MO message: \n" +
                                JsonConvert.SerializeObject(response, Formatting.Indented));
        }