/// <summary>
        /// Method for deleting a notice - RS
        /// </summary>
        /// <param name="noticeId"></param>
        /// <param name="instituteId"></param>
        /// <returns></returns>
        public async Task <dynamic> DeleteCircularNoticeAsync(int noticeId, int instituteId)
        {
            CircularNotice circularNotice = await _imsDbContext.CircularNotices.FirstOrDefaultAsync(x => x.Id == noticeId && x.InstituteId == instituteId);

            if (circularNotice == null)
            {
                return(new { Message = "No notice exist with this id", HasError = true });
            }
            else
            {
                // Delete recipients
                List <CircularNoticeRecipient> circularNoticeRecipientsList = await _imsDbContext.CircularNoticeRecipients
                                                                              .Where(x => x.CircularNoticeId == circularNotice.Id)
                                                                              .ToListAsync();

                _imsDbContext.CircularNoticeRecipients.RemoveRange(circularNoticeRecipientsList);
                await _imsDbContext.SaveChangesAsync();

                // Delete notice
                _imsDbContext.CircularNotices.Remove(circularNotice);
                await _imsDbContext.SaveChangesAsync();

                return(new { Message = "Notice deleted successfully", HasError = false });
            }
        }
        /// <summary>
        /// Method for fetching a particular circular/notice by id - RS
        /// </summary>
        /// <param name="currentUserInstituteId"></param>
        /// <param name="noticeId"></param>
        /// <returns></returns>
        public async Task <CircularNoticeAc> GetCircularNoticeByIdAsync(int currentUserInstituteId, int noticeId)
        {
            CircularNotice circularNotice = await _imsDbContext.CircularNotices
                                            .Include(x => x.CircularNoticeRecipients)
                                            .FirstOrDefaultAsync(x => x.InstituteId == currentUserInstituteId && x.Id == noticeId);

            CircularNoticeAc circularNoticeAc = new CircularNoticeAc
            {
                Id                           = circularNotice.Id,
                Description                  = circularNotice.Description,
                Message                      = circularNotice.Message,
                NoticeDate                   = circularNotice.NoticeDate,
                NoticeTo                     = circularNotice.NoticeTo,
                NoticeToString               = EnumHelperService.GetDescription(circularNotice.NoticeTo),
                NoticeType                   = circularNotice.NoticeType,
                NoticeTypeString             = EnumHelperService.GetDescription(circularNotice.NoticeType),
                CircularNoticeRecipientsList = new List <CircularNoticeRecipientAc>()
            };

            List <ApplicationUser> circularNoticeRecipientsList = await _imsDbContext.CircularNoticeRecipients
                                                                  .Where(x => x.CircularNoticeId == noticeId)
                                                                  .Include(x => x.Recipient)
                                                                  .Select(x => x.Recipient)
                                                                  .ToListAsync();

            foreach (CircularNoticeRecipient circularNoticeRecipient in circularNotice.CircularNoticeRecipients)
            {
                circularNoticeAc.CircularNoticeRecipientsList.Add(new CircularNoticeRecipientAc
                {
                    RecipientId         = circularNoticeRecipient.RecipientId,
                    RecipientName       = circularNoticeRecipientsList.FirstOrDefault(x => x.Id == circularNoticeRecipient.RecipientId)?.Name,
                    CircularNoticeId    = circularNotice.Id,
                    RecipientType       = circularNoticeRecipient.RecipientType,
                    RecipientTypeString = EnumHelperService.GetDescription(circularNoticeRecipient.RecipientType)
                });
            }

            return(circularNoticeAc);
        }
        /// <summary>
        /// Method for updating an existing circular/notice - RS
        /// </summary>
        /// <param name="currentUserInstituteId"></param>
        /// <param name="updatedCircularNoticeAc"></param>
        /// <returns></returns>
        public async Task <dynamic> UpdateCircularNoticeAsync(int currentUserInstituteId, CircularNoticeAc updatedCircularNoticeAc, ApplicationUser currentUser)
        {
            CircularNotice existingNotice = await _imsDbContext.CircularNotices.FirstOrDefaultAsync(x => x.Id == updatedCircularNoticeAc.Id && x.InstituteId == currentUserInstituteId);

            if (existingNotice == null)
            {
                return(new { Message = "No notice exists with this id", HasError = true });
            }
            else
            {
                // Update notice
                existingNotice.Message     = updatedCircularNoticeAc.Message;
                existingNotice.Description = updatedCircularNoticeAc.Description;
                existingNotice.NoticeDate  = updatedCircularNoticeAc.NoticeDate;
                existingNotice.NoticeType  = updatedCircularNoticeAc.NoticeType;
                existingNotice.NoticeTo    = updatedCircularNoticeAc.NoticeTo;
                existingNotice.UpdatedById = currentUser.Id;

                _imsDbContext.CircularNotices.Update(existingNotice);
                await _imsDbContext.SaveChangesAsync();

                // Update notice recipients
                List <CircularNoticeRecipient> noticeRecipientMappingsList = await _imsDbContext.CircularNoticeRecipients
                                                                             .Where(x => x.CircularNoticeId == existingNotice.Id).ToListAsync();

                _imsDbContext.CircularNoticeRecipients.RemoveRange(noticeRecipientMappingsList);
                await _imsDbContext.SaveChangesAsync();
                await AddNoticeRecipientsAsync(existingNotice.Id, updatedCircularNoticeAc.CircularNoticeRecipientsList);

                noticeRecipientMappingsList = await _imsDbContext.CircularNoticeRecipients.Include(s => s.Recipient)
                                              .Where(x => x.CircularNoticeId == existingNotice.Id).ToListAsync();

                if (updatedCircularNoticeAc.IsNotificationSendingEnabled)
                {
                    #region Send Mail/Message

                    var tos = new List <EmailAddress>();
                    var messageRecipients = new List <string>();
                    foreach (var user in noticeRecipientMappingsList)
                    {
                        if (!string.IsNullOrEmpty(user.Recipient.Email))
                        {
                            tos.Add(new EmailAddress()
                            {
                                Name = user.Recipient.Name, Address = user.Recipient.Email
                            });
                        }
                        else
                        {
                            messageRecipients.Add(user.Recipient.UserName);
                        }
                    }
                    var emailConfiguration = await _imsDbContext.AdministrationEmailConfigurations.Include(s => s.Institute)
                                             .FirstOrDefaultAsync(x => x.InstituteId == existingNotice.InstituteId);

                    if (emailConfiguration != null)
                    {
                        var    path           = Path.Combine(Directory.GetCurrentDirectory(), "MailTemplates");
                        var    engine         = new RazorLightEngineBuilder().UseFilesystemProject(path).UseMemoryCachingProvider().Build();
                        string resultFromFile = await engine.CompileRenderAsync("NotificationMail.cshtml", new CircularNoticeAc()
                        {
                            InstituteName = updatedCircularNoticeAc.InstituteName, Message = existingNotice.Message
                        });

                        // Send Email
                        var email = new EmailMessage()
                        {
                            Content       = resultFromFile,
                            ToAddresses   = tos,
                            FromAddresses = new List <EmailAddress>()
                            {
                                new EmailAddress()
                                {
                                    Name = emailConfiguration.Institute.Name, Address = emailConfiguration.MailUserName
                                }
                            },
                            Subject = "Notice"
                        };
                        _emailService.SendMail(email);
                    }
                    var recipient = string.Empty;
                    foreach (var user in messageRecipients)
                    {
                        recipient += user;
                        recipient += ",";
                    }
                    // Send SMS
                    await _smsService.SendSms(recipient, existingNotice.Message);

                    #endregion

                    #region Add events for report generation

                    await _eventManagementRepository.AddEventReportInfoAsync(currentUserInstituteId, updatedCircularNoticeAc.Description,
                                                                             EnumHelperService.GetDescription(updatedCircularNoticeAc.NoticeType), EnumHelperService.GetDescription(updatedCircularNoticeAc.NoticeTo), TemplateFormatEnum.Email);

                    await _eventManagementRepository.AddEventReportInfoAsync(currentUserInstituteId, updatedCircularNoticeAc.Description,
                                                                             EnumHelperService.GetDescription(updatedCircularNoticeAc.NoticeType), EnumHelperService.GetDescription(updatedCircularNoticeAc.NoticeTo), TemplateFormatEnum.Sms);

                    #endregion
                }

                // Add notification
                await AddNotificationsAsync(currentUserInstituteId, currentUser, updatedCircularNoticeAc);

                return(new { Message = EnumHelperService.GetDescription(existingNotice.NoticeType) + " updated successfully" });
            }
        }