/// <summary>
        /// Method for updating an existing activity - RS
        /// </summary>
        /// <param name="activityId"></param>
        /// <param name="updatedStaffActivity"></param>
        /// <param name="currentUser"></param>
        /// <returns></returns>
        public async Task <dynamic> UpdateActivityAsync(int activityId, StaffActivityAc updatedStaffActivityAc, ApplicationUser currentUser)
        {
            int currentUserInstituteId = await _instituteUserMappingHelperService.GetUserCurrentSelectedInstituteIdAsync(currentUser.Id, true);

            StaffActivity existingActivity = await _imsDbContext.StaffActivities.FirstOrDefaultAsync(x => x.Id == activityId && x.InstituteId == currentUserInstituteId);

            if (existingActivity == null)
            {
                return(new { Message = "No activity exists with this id", HasError = true });
            }
            else if (await _imsDbContext.StaffActivities.AnyAsync(x => x.Id != activityId && x.InstituteId == currentUserInstituteId &&
                                                                  x.Name.ToLowerInvariant().Equals(updatedStaffActivityAc.Name.ToLowerInvariant()) &&
                                                                  x.StartDate == updatedStaffActivityAc.StartDate && x.EndDate == updatedStaffActivityAc.EndDate))
            {
                return(new { Message = "Activity already exists with this name within the same date range", HasError = true });
            }
            else
            {
                // Update activity
                existingActivity.Name             = updatedStaffActivityAc.Name;
                existingActivity.Description      = updatedStaffActivityAc.Description;
                existingActivity.StartDate        = updatedStaffActivityAc.StartDate;
                existingActivity.EndDate          = updatedStaffActivityAc.EndDate;
                existingActivity.IsActive         = updatedStaffActivityAc.IsActive;
                existingActivity.MeetingAgendaId  = updatedStaffActivityAc.MeetingAgendaId;
                existingActivity.ActivityStatusId = updatedStaffActivityAc.ActivityStatusId;
                existingActivity.StartTime        = updatedStaffActivityAc.StartTime;
                existingActivity.EndTime          = updatedStaffActivityAc.EndTime;
                existingActivity.Location         = updatedStaffActivityAc.Location;
                _imsDbContext.StaffActivities.Update(existingActivity);
                await _imsDbContext.SaveChangesAsync();

                // Update activity attendee
                List <ActivityAttendeeMapping> activityAttendeeMappingsList = await _imsDbContext.ActivityAttendeeMappings
                                                                              .Where(x => x.ActivityId == existingActivity.Id).ToListAsync();

                _imsDbContext.ActivityAttendeeMappings.RemoveRange(activityAttendeeMappingsList);
                await _imsDbContext.SaveChangesAsync();
                await AddActivityAttendeeAsync(existingActivity.Id, updatedStaffActivityAc.ActivityAttendeeList);

                // Add notification
                if (existingActivity.IsActive)
                {
                    await AddNotificationsAsync(currentUserInstituteId, currentUser, updatedStaffActivityAc);
                }

                return(new { Message = "Activity updated successfully" });
            }
        }
        /// <summary>
        /// Method for adding new activity - RS
        /// </summary>
        /// <param name="newStaffActivity"></param>
        /// <param name="currentUser"></param>
        /// <returns></returns>
        public async Task <dynamic> AddActivityAsync(StaffActivityAc newStaffActivityAc, ApplicationUser currentUser)
        {
            int currentUserInstituteId = await _instituteUserMappingHelperService.GetUserCurrentSelectedInstituteIdAsync(currentUser.Id, true);

            if (await _imsDbContext.StaffActivities.AnyAsync(x => x.InstituteId == currentUserInstituteId &&
                                                             x.Name.ToLowerInvariant().Equals(newStaffActivityAc.Name.ToLowerInvariant()) && x.StartDate == newStaffActivityAc.StartDate && x.EndDate == newStaffActivityAc.EndDate))
            {
                return(new { Message = "Activity already exists with this name within the same date range", HasError = true });
            }
            else
            {
                // Add activity
                StaffActivity newStaffActivity = new StaffActivity
                {
                    ActivityStatusId = newStaffActivityAc.ActivityStatusId,
                    Description      = newStaffActivityAc.Description,
                    EndDate          = newStaffActivityAc.EndDate,
                    EndTime          = newStaffActivityAc.EndTime,
                    IsActive         = newStaffActivityAc.IsActive,
                    Location         = newStaffActivityAc.Location,
                    MeetingAgendaId  = newStaffActivityAc.MeetingAgendaId,
                    Name             = newStaffActivityAc.Name,
                    StartDate        = newStaffActivityAc.StartDate,
                    StartTime        = newStaffActivityAc.StartTime,
                    InstituteId      = currentUserInstituteId,
                    CreatedOn        = DateTime.UtcNow
                };
                _imsDbContext.StaffActivities.Add(newStaffActivity);
                await _imsDbContext.SaveChangesAsync();

                // Add activity attendee
                await AddActivityAttendeeAsync(newStaffActivity.Id, newStaffActivityAc.ActivityAttendeeList);

                // Add notification
                if (newStaffActivity.IsActive)
                {
                    await AddNotificationsAsync(currentUserInstituteId, currentUser, newStaffActivityAc);
                }

                return(new { Message = "Activity created successfully" });
            }
        }
 private void SetDefaultClickActions()
 {
     ClickAction = (viewModel, position) =>
                   StaffActivity.StartActivity(Context, viewModel.Model.Id, BaseAniDroidActivity.ObjectBrowseRequestCode);
 }
        /// <summary>
        /// Method for fetching an activity by id - RS
        /// </summary>
        /// <param name="activityId"></param>
        /// <param name="currentUser"></param>
        /// <returns></returns>
        public async Task <StaffActivityAc> GetActivityByIdAsync(int activityId, ApplicationUser currentUser)
        {
            int currentUserInstituteId = await _instituteUserMappingHelperService.GetUserCurrentSelectedInstituteIdAsync(currentUser.Id, true);

            StaffActivity staffActivity = await _imsDbContext.StaffActivities
                                          .Include(x => x.MeetingAgenda)
                                          .Include(x => x.ActivityStatus)
                                          .Include(x => x.ActivityAttendeeMappings)
                                          .FirstOrDefaultAsync(x => x.Id == activityId && x.InstituteId == currentUserInstituteId);

            StaffActivityAc staffActivityAc = new StaffActivityAc
            {
                Id                   = staffActivity.Id,
                Name                 = staffActivity.Name,
                Description          = staffActivity.Description,
                StartDate            = staffActivity.StartDate,
                EndDate              = staffActivity.EndDate,
                IsActive             = staffActivity.IsActive,
                InstituteId          = staffActivity.InstituteId,
                ActivityStatusId     = staffActivity.ActivityStatusId,
                ActivityStatusName   = staffActivity.ActivityStatus.Name,
                MeetingAgendaId      = staffActivity.MeetingAgendaId,
                MeetingAgendaName    = staffActivity.MeetingAgenda.Name,
                StartTime            = staffActivity.StartTime,
                EndTime              = staffActivity.EndTime,
                Location             = staffActivity.Location,
                ActivityAttendeeList = new List <StaffActivityAttendeeMappingAc>()
            };

            List <ApplicationUser> activityAttendeesList = await _imsDbContext.ActivityAttendeeMappings
                                                           .Where(x => x.ActivityId == activityId)
                                                           .Include(x => x.Attendee)
                                                           .Select(x => x.Attendee)
                                                           .ToListAsync();

            List <StudentBasicInformation> studentBasicInformationList = await _imsDbContext.StudentBasicInformation.Where(x => x.InstituteId == currentUserInstituteId).ToListAsync();

            List <StaffBasicPersonalInformation> staffBasicPersonalInformationList = await _imsDbContext.StaffBasicPersonalInformation.Where(x => x.InstituteId == currentUserInstituteId).ToListAsync();

            foreach (ActivityAttendeeMapping activityAttendeeMapping in staffActivity.ActivityAttendeeMappings)
            {
                string attendeeName = activityAttendeesList.FirstOrDefault(x => x.Id == activityAttendeeMapping.AttendeeId)?.Name;
                if (activityAttendeeMapping.ActivityAttendeeType == ActivityAttendeeTypeEnum.Staff)
                {
                    attendeeName = staffBasicPersonalInformationList.FirstOrDefault(x => x.UserId == activityAttendeeMapping.AttendeeId).FirstName;
                }
                else if (activityAttendeeMapping.ActivityAttendeeType == ActivityAttendeeTypeEnum.Student)
                {
                    attendeeName = studentBasicInformationList.FirstOrDefault(x => x.UserId == activityAttendeeMapping.AttendeeId).FirstName;
                }
                staffActivityAc.ActivityAttendeeList.Add(new StaffActivityAttendeeMappingAc
                {
                    ActivityId                 = staffActivity.Id,
                    ActivityName               = staffActivity.Name,
                    ActivityAttendeeType       = activityAttendeeMapping.ActivityAttendeeType,
                    ActivityAttendeeTypeString = EnumHelperService.GetDescription(activityAttendeeMapping.ActivityAttendeeType),
                    AttendeeId                 = activityAttendeeMapping.AttendeeId,
                    AttendeeName               = attendeeName
                });
            }

            return(staffActivityAc);
        }