private async Task <Activity> ConvertToActivity(InfobipWhatsAppIncomingResult 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 = InfobipWhatsAppDeliveryReportToActivity.Convert(response, _whatsAppAdapterOptions.InfobipWhatsAppNumber);
                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(InfobipWhatsAppSeenReportToActivity.Convert(response));
            }

            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, _infobipWhatsAppClient);

                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));
        }
        private static void HandleCallbackData(InfobipWhatsAppIncomingResult response, Activity activity)
        {
            if (string.IsNullOrWhiteSpace(response.CallbackData))
            {
                return;
            }
            var serialized = JsonConvert.DeserializeObject <Dictionary <string, string> >(response.CallbackData);

            activity.AddInfobipCallbackData(serialized);
        }
        private static void VerifyResultCoreProperties(InfobipWhatsAppIncomingResult result, Activity activity)
        {
            var timestamp = result.SeenAt ?? result.DoneAt;

            Assert.Equal(result.MessageId, activity.Id);
            Assert.Equal(result.From, activity.From.Id);
            Assert.Equal(result.To, activity.Recipient.Id);
            Assert.Equal(result.To, activity.Conversation.Id);
            Assert.Equal(result, activity.ChannelData);
            Assert.Equal(timestamp, activity.Timestamp);
        }
        public static Activity Convert(InfobipWhatsAppIncomingResult result, string whatsAppNumber)
        {
            var activity = CreateBaseDeliveryReportActivity(result);

            activity.ChannelId = InfobipWhatsAppConstants.ChannelName;
            activity.From      = new ChannelAccount {
                Id = whatsAppNumber
            };

            return(activity);
        }
        public static Activity Convert(InfobipWhatsAppIncomingResult result)
        {
            var activity = ConvertToEvent(result);

            activity.Name      = InfobipReportTypes.SEEN;
            activity.Timestamp = result.SeenAt;
            activity.ChannelId = InfobipWhatsAppConstants.ChannelName;
            activity.From      = new ChannelAccount {
                Id = result.From
            };

            return(activity);
        }
        public static async Task <Activity> Convert(InfobipWhatsAppIncomingResult result, IInfobipWhatsAppClient infobipWhatsAppClient)
        {
            var activity = ConvertToMessage(result);

            activity.ChannelId = InfobipWhatsAppConstants.ChannelName;

            if (result.Message.Type == InfobipIncomingMessageTypes.Text)
            {
                activity.Text       = result.Message.Text;
                activity.TextFormat = TextFormatTypes.Plain;
            }
            else if (result.Message.Type == InfobipIncomingMessageTypes.Location)
            {
                activity.Entities.Add(new GeoCoordinates
                {
                    Latitude  = result.Message.Latitude,
                    Longitude = result.Message.Longitude
                });
            }
            else if (result.Message.IsMedia())
            {
                var contentType = await infobipWhatsAppClient.GetContentTypeAsync(result.Message.Url.AbsoluteUri).ConfigureAwait(false);

                activity.Attachments = new List <Attachment>
                {
                    new Attachment
                    {
                        ContentType = contentType,
                        ContentUrl  = result.Message.Url.AbsoluteUri,
                        Name        = result.Message.Caption
                    }
                };
            }
            else
            {
                return(null);
            }

            return(activity);
        }