/// <summary>
        /// Update Google Events in Google Calenar
        /// </summary>
        /// <param name="owner">calendar owner</param>
        /// <param name="calendarId">calendar id</param>
        /// <param name="events">events to update</param>
        /// <returns>async task for the background Api tasks</returns>
        private static async Task UpdateGoogleEventsAsync(string owner, string calendarId, List <GCalEventItem> events)
        {
            try {
                int batchCount = 1;

                // Create a batch request.
                var request = new BatchRequest(GetCalendarService(owner));

                foreach (GCalEventItem e in events)
                {
                    Event tempEvent = new Event();

                    string summary = e.StaffMember.ToString() + ": " + e.Client;

                    tempEvent.Summary = summary;
                    tempEvent.Start   = new EventDateTime()
                    {
                        DateTime = e.StartTime
                    };
                    tempEvent.End = new EventDateTime()
                    {
                        DateTime = e.EndTime
                    };

                    RemindersData        eventReminders = new RemindersData();
                    List <EventReminder> eventReminder  = new List <EventReminder>();
                    eventReminder.Add(new EventReminder {
                        Method = "popup", Minutes = 30
                    });
                    eventReminders.Overrides  = eventReminder;
                    eventReminders.UseDefault = false;

                    tempEvent.Reminders = eventReminders;

                    ExtendedPropertiesData extendedProps = new ExtendedPropertiesData();
                    extendedProps.Private__ = new Dictionary <string, string>();
                    extendedProps.Private__.Add("staffMember", e.StaffMember.ToString());
                    extendedProps.Private__.Add("appointmentType", e.AppointmentType);
                    extendedProps.Private__.Add("client", e.Client);
                    extendedProps.Private__.Add("salonCalId", e.SalonCalendarId.ToString());

                    tempEvent.ExtendedProperties = extendedProps;

                    if (batchCount < 900)
                    {
                        request.Queue <Event>(
                            GetCalendarService(owner).Events.Update(tempEvent, calendarId, e.EventId), (content, error, i, message) =>
                        {
                            // Put your callback code here.
                            if (error != null)
                            {
                                log.Error("Error updating Google Calendar with new details: " + error.Message);
                            }
                        });
                        batchCount++;
                    }
                    else
                    {
                        // Execute the batch request and create a new batch as cannot send more than 1000
                        await request.ExecuteAsync();

                        batchCount = 1;
                        request    = new BatchRequest(GetCalendarService(owner));
                    }
                }

                // Execute the batch request
                await request.ExecuteAsync();

                foreach (var ev in events)
                {
                    var entryToUpdate = googleCalEvents.FirstOrDefault(x => x.SalonCalendarId == ev.SalonCalendarId);
                    if (entryToUpdate != null)
                    {
                        entryToUpdate.EventId         = ev.EventId;
                        entryToUpdate.AppointmentType = ev.AppointmentType;
                        entryToUpdate.Client          = ev.Client;

                        entryToUpdate.StaffMember = ev.StaffMember;

                        entryToUpdate.StartTime       = ev.StartTime;
                        entryToUpdate.EndTime         = ev.EndTime;
                        entryToUpdate.DurationMinutes = ev.DurationMinutes;
                    }
                }
            }
            catch (Exception e)
            {
                log.Error("Error updating canged Google Events : " + e.Message);
            }
        }
        /// <summary>
        /// Create new events in the Google Calendar
        /// </summary>
        /// <param name="owner">Calendar owner</param>
        /// <param name="calendarId">Calendar id</param>
        /// <param name="events">list of events to create</param>
        /// <returns>async Task for running API in background</returns>
        private static async Task CreateNewEventsAsync(string owner, string calendarId, List <GCalEventItem> events)
        {
            try
            {
                int eventCount = 1;

                // Create a batch request.
                var request = new BatchRequest(GetCalendarService(owner));

                foreach (GCalEventItem e in events)
                {
                    Event tempEvent = new Event();

                    string summary = e.StaffMember.ToString() + ": " + e.Client;

                    tempEvent.Summary = summary;
                    tempEvent.Start   = new EventDateTime()
                    {
                        DateTime = e.StartTime
                    };
                    tempEvent.End = new EventDateTime()
                    {
                        DateTime = e.EndTime
                    };

                    RemindersData        eventReminders = new RemindersData();
                    List <EventReminder> eventReminder  = new List <EventReminder>();
                    eventReminder.Add(new EventReminder {
                        Method = "popup", Minutes = 30
                    });
                    eventReminders.Overrides  = eventReminder;
                    eventReminders.UseDefault = false;

                    tempEvent.Reminders = eventReminders;

                    ExtendedPropertiesData extendedProps = new ExtendedPropertiesData();
                    extendedProps.Private__ = new Dictionary <string, string>();
                    extendedProps.Private__.Add("staffMember", e.StaffMember.ToString());
                    extendedProps.Private__.Add("appointmentType", e.AppointmentType);
                    extendedProps.Private__.Add("client", e.Client);
                    extendedProps.Private__.Add("salonCalId", e.SalonCalendarId.ToString());

                    tempEvent.ExtendedProperties = extendedProps;

                    if (eventCount < 900)
                    {
                        request.Queue <Event>(
                            GetCalendarService(owner).Events.Insert(tempEvent, calendarId), (content, error, i, message) =>
                        {
                            // Put your callback code here.
                            if (error != null)
                            {
                                log.Error("Error creating new appointments in Google Calendar: " + error.Message);
                            }

                            if (content != null)
                            {
                                // do something
                                log.Debug("New event id = " + content.Id);
                                e.EventId = content.Id;
                            }
                        });
                        eventCount++;
                    }
                    else
                    {
                        // Execute the batch request and create a new batch as cannot send more than 1000
                        await request.ExecuteAsync();

                        eventCount = 1;
                        request    = new BatchRequest(GetCalendarService(owner));
                    }
                }

                // Execute the batch request
                await request.ExecuteAsync();

                if (googleCalEvents != null)
                {
                    googleCalEvents = (List <GCalEventItem>)googleCalEvents.Concat(events).ToList();
                }
                else
                {
                    googleCalEvents = events;
                }
            }
            catch (Exception e)
            {
                log.Error("Error creating new Google Events : " + e.Message);
            }
        }