/// <summary>
        /// Get User presence details in a batch.
        /// </summary>
        /// <param name="peoplePresenceDataArray">Array of People Presence Data object used to get presence information.</param>
        /// <returns>People Presence Data model data filled with presence information.</returns>
        public async Task <List <PeoplePresenceData> > GetBatchUserPresenceAsync(PeoplePresenceData[] peoplePresenceDataArray)
        {
            List <PeoplePresenceData> peoplePresenceDataList            = new List <PeoplePresenceData>();
            List <PeoplePresenceData> peoplePresenceDataListReturnValue = new List <PeoplePresenceData>();

            foreach (PeoplePresenceData member in peoplePresenceDataArray)
            {
                string userPrincipalName = member.UserPrincipalName.ToLower();
                if (!this.memoryCache.TryGetValue(userPrincipalName, out PeoplePresenceData peoplePresenceDataObj))
                {
                    peoplePresenceDataObj = new PeoplePresenceData()
                    {
                        UserPrincipalName = member.UserPrincipalName,
                        Id = member.Id,
                    };
                    peoplePresenceDataList.Add(peoplePresenceDataObj);
                }
                else
                {
                    peoplePresenceDataListReturnValue.Add(peoplePresenceDataObj);
                }
            }

            if (peoplePresenceDataList.Count > 0)
            {
                this.telemetryClient.TrackEvent($"GetBatchUserPresenceAsync. Getting presence from MS Graph. User Count : {peoplePresenceDataList.Count()}, users :{JsonConvert.SerializeObject(peoplePresenceDataList)}");

                string[] scopes = { "Presence.Read.All" };

                MemoryCacheEntryOptions options = new MemoryCacheEntryOptions
                {
                    AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(Convert.ToInt32(this.configuration["CacheInterval"])), // cache will expire in 60 seconds or 1 minutes
                };

                var presenceBatches = peoplePresenceDataList.SplitList(19); // MS Graph batch limit is 20

                foreach (var presenceBatch in presenceBatches)
                {
                    try
                    {
                        List <MSGraphBatchRequest> allRequests = MSGraphBatchRequestCreator.CreateBatchRequestPayloadForPresence("/users/{0}/presence", "GET", presenceBatch);
                        MSGraphBatchRequestPayload payload     = new MSGraphBatchRequestPayload()
                        {
                            Requests = allRequests,
                        };

                        List <MSGraphBatchResponse <dynamic> > responses = await this.protectedApiCallHelper.CallGraphApiPostOnBehalfOfUser(scopes, MSGraphBatchAPI, JsonConvert.SerializeObject(payload));

                        if (responses != null)
                        {
                            foreach (var presenceInfo in responses)
                            {
                                try
                                {
                                    string             presenceStatus = presenceInfo.Body.availability;
                                    string             userAADId      = presenceInfo.Body.id;
                                    PeoplePresenceData peoplePresence = new PeoplePresenceData()
                                    {
                                        Availability      = presenceStatus.ToLower() == "available" ? "Online" : presenceStatus,
                                        UserPrincipalName = presenceInfo.Id.ToLower(),
                                        Id = userAADId,
                                    };

                                    this.memoryCache.Set(peoplePresence.UserPrincipalName, peoplePresence, options);

                                    peoplePresenceDataListReturnValue.Add(peoplePresence);
                                }
                                catch (Exception ex)
                                {
                                    if (presenceInfo != null)
                                    {
                                        this.telemetryClient.TrackTrace($"GetBatchUserPresenceAsync. An error occurred: {ex.Message}. PeoplePresenceDataJObject : {JsonConvert.SerializeObject(presenceInfo)}", SeverityLevel.Error);
                                        this.telemetryClient.TrackException(ex);
                                    }
                                    else
                                    {
                                        this.telemetryClient.TrackTrace($"GetBatchUserPresenceAsync. An error occurred: {ex.Message} ", SeverityLevel.Error);
                                        this.telemetryClient.TrackException(ex);
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        if (presenceBatch != null)
                        {
                            this.telemetryClient.TrackTrace($"GetBatchUserPresenceAsync. An error occurred: {ex.Message}. PresenceBatch : {JsonConvert.SerializeObject(presenceBatch)}", SeverityLevel.Error);
                            this.telemetryClient.TrackException(ex);
                        }
                        else
                        {
                            this.telemetryClient.TrackTrace($"GetBatchUserPresenceAsync. An error occurred: {ex.Message} ", SeverityLevel.Error);
                            this.telemetryClient.TrackException(ex);
                        }
                    }
                }
            }
            else
            {
                this.telemetryClient.TrackEvent($"GetBatchUserPresenceAsync. Presence of all users found in memory.");
            }

            return(peoplePresenceDataListReturnValue);
        }