// GET: Tickets/Create
        public ActionResult Create() {
            TicketsModel ticketsModel = new TicketsModel();
            if (ticketsModel.AssignedToUserId == null) {
                ViewBag.AssignedToUserId = "Not Assigned Yet";
            }
            else {
                ViewBag.AssignedToUserId = new SelectList(db.Users, "Id", "DisplayName");
            }
            ViewBag.OwnerUserId = new SelectList(db.Users, "Id", "DisplayName");

            ViewBag.ProjectId = new SelectList(db.ProjectsData, "Id", "Name");
            ViewBag.TicketPriorityId = new SelectList(db.TicketPrioritiesData, "Id", "Name");
            ViewBag.TicketStatusId = new SelectList(db.TicketStatusesData, "Id", "Name");
            ViewBag.TicketTypeId = new SelectList(db.TicketTypesData, "Id", "Name");
            ViewBag.TicketAttachmentId = new SelectList(db.AttachmentData, "Id", "FileUrl");
            return View(ticketsModel);
        }
        public ActionResult Edit(TicketsModel ticketsModel) {

            if (ModelState.IsValid) {

                var userId = User.Identity.GetUserId();
                var user = db.Users.Find(userId);
                var dateChanged = System.DateTimeOffset.Now;
                var oldTicket = db.TicketsData.AsNoTracking().FirstOrDefault(t => t.Id == ticketsModel.Id);
                var assignedUser = db.Users.Find(ticketsModel.AssignedToUserId);

                //Title Notification
                if (oldTicket.Title != ticketsModel.Title) {
                    TicketHistoriesModel histTitle = new TicketHistoriesModel {
                        TicketId = ticketsModel.Id,
                        Property = "Title",
                        OldValue = oldTicket.Title,
                        NewValue = ticketsModel.Title,
                        ChangedDate = dateChanged,
                        UserId = userId
                    };
                    db.TicketHistoriesData.Add(histTitle);
                }

                //Ticket Title Description
                if (oldTicket.Description != ticketsModel.Description) {
                    TicketHistoriesModel histDescription = new TicketHistoriesModel {
                        TicketId = ticketsModel.Id,
                        Property = "Description",
                        OldValue = oldTicket.Description,
                        NewValue = ticketsModel.Description,
                        ChangedDate = dateChanged,
                        UserId = userId
                    };
                    db.TicketHistoriesData.Add(histDescription);
                }

                //Ticket Assigned To Notification
                if (oldTicket.AssignedToUserId != ticketsModel.AssignedToUserId) {
                    TicketHistoriesModel histAssignedTo = new TicketHistoriesModel {
                        TicketId = ticketsModel.Id,
                        Property = "Assigned To",
                        OldValue = db.Users.Find(oldTicket.AssignedToUserId).DisplayName,
                        NewValue = db.Users.Find(ticketsModel.AssignedToUserId).DisplayName,
                        ChangedDate = dateChanged,
                        UserId = userId
                    };
                    db.TicketHistoriesData.Add(histAssignedTo);

                    //Send Notification for Assigned To Change
                    TicketNotificationsModel ticketNotification = new TicketNotificationsModel {
                        TicketId = ticketsModel.Id,
                        UserId = User.Identity.GetUserId(),
                        Sender = user.Email,
                        Recipient = assignedUser.Email,
                        NotificationSubject = "Ticket \"" + ticketsModel.Title + "\" has been changed.",
                        NotificationMessage = "The Ticket <b>" + ticketsModel.Title + "</b> was reassigned to " + user.DisplayName + ".<br /><br />" +
                            "Previous Assignee: " + histAssignedTo.OldValue + "<br />" +
                            "New Assignee: " + histAssignedTo.NewValue + ".<br /><br />" +
                            "This change was made by " + user.DisplayName + ".",
                        SentDate = DateTimeOffset.Now
                    };
                    db.TicketNotificationsData.Add(ticketNotification);
                    assignedUser.SendNotification(ticketNotification.NotificationSubject, ticketNotification.NotificationMessage);
                }

                //Ticket Type Notification
                if (oldTicket.TicketTypeId != ticketsModel.TicketTypeId) {
                    TicketHistoriesModel histTicketType = new TicketHistoriesModel {
                        TicketId = ticketsModel.Id,
                        Property = "Ticket Type",
                        OldValue = db.TicketTypesData.Find(oldTicket.TicketTypeId).Name,
                        NewValue = db.TicketTypesData.Find(ticketsModel.TicketTypeId).Name,
                        ChangedDate = dateChanged,
                        UserId = userId
                    };
                    db.TicketHistoriesData.Add(histTicketType);
                }

                //Ticket Priority Notification
                if (oldTicket.TicketPriorityId != ticketsModel.TicketPriorityId) {

                    TicketHistoriesModel histPriority = new TicketHistoriesModel {
                        TicketId = ticketsModel.Id,
                        Property = "Ticket Priority",
                        OldValue = db.TicketPrioritiesData.Find(oldTicket.TicketPriorityId).Name,
                        NewValue = db.TicketPrioritiesData.Find(ticketsModel.TicketPriorityId).Name,
                        ChangedDate = dateChanged,
                        UserId = userId
                    };
                    db.TicketHistoriesData.Add(histPriority);

                    //Send Notification for Priority Change
                    TicketNotificationsModel ticketNotification = new TicketNotificationsModel {
                        TicketId = ticketsModel.Id,
                        UserId = User.Identity.GetUserId(),
                        Sender = user.Email,
                        Recipient = assignedUser.Email,
                        NotificationSubject = "The Priority for the Ticket titled \"" + ticketsModel.Title + "\" has been changed",
                        NotificationMessage = "The Ticket titled <b>" + ticketsModel.Title + "</b> has had its Priority changed. <br /><br />" +
                            "Previous Priority: " + histPriority.OldValue + "<br />" +
                            "New Priority: " + histPriority.NewValue + ".<br /><br />" +
                            "The change was made by " + user.DisplayName + ".",
                        SentDate = DateTimeOffset.Now
                    };
                    db.TicketNotificationsData.Add(ticketNotification);
                    assignedUser.SendNotification(ticketNotification.NotificationSubject, ticketNotification.NotificationMessage);
                }

                //Ticket Status Notification
                if (oldTicket.TicketStatusId != ticketsModel.TicketStatusId) {
                    TicketHistoriesModel histStatus = new TicketHistoriesModel {
                        TicketId = ticketsModel.Id,
                        Property = "Ticket Status",
                        OldValue = db.TicketStatusesData.Find(oldTicket.TicketStatusId).Name,
                        NewValue = db.TicketStatusesData.Find(ticketsModel.TicketStatusId).Name,
                        ChangedDate = dateChanged,
                        UserId = userId
                    };
                    db.TicketHistoriesData.Add(histStatus);

                    //Send Notification for Priority Change
                    TicketNotificationsModel ticketNotification = new TicketNotificationsModel {
                        TicketId = ticketsModel.Id,
                        UserId = User.Identity.GetUserId(),
                        Sender = user.Email,
                        Recipient = assignedUser.Email,
                        NotificationSubject = "The Status for the Ticket titled \"" + ticketsModel.Title + "\" has been changed",
                        NotificationMessage = "The Ticket titled <b>" + ticketsModel.Title + "</b> has had its Status changed. <br /><br />" +
                                    "Previous Status: " + histStatus.OldValue + "<br />" +
                                    "New Status: " + histStatus.NewValue + ".<br /><br />" +
                                    "The change was made by " + user.DisplayName + ".",
                        SentDate = DateTimeOffset.Now
                    };
                    db.TicketNotificationsData.Add(ticketNotification);
                    assignedUser.SendNotification(ticketNotification.NotificationSubject, ticketNotification.NotificationMessage);

                    if ((db.Entry(ticketsModel).Property(p => p.AssignedToUserId).IsModified == true) && (assignedUser.Roles.Any(r => r.RoleId == "c8d38989-258c-484b-9606-6f733c273059"))) { 
                        assignedUser.SendNotification(
                            "You have been assigned a Ticket",
                            "The Ticket titled <b>" + ticketsModel.Title + "</b> has been assigned to you. <br /><br />" +
                            "The change was made by " + user.DisplayName + "."
                            );
                    }
                }

                ticketsModel.UpdatedDate = DateTimeOffset.Now;

                db.TicketsData.Attach(ticketsModel);
                db.Entry(ticketsModel).Property(p => p.AssignedToUserId).IsModified = true;
                db.Entry(ticketsModel).Property(p => p.Description).IsModified = true;
                db.Entry(ticketsModel).Property(p => p.Title).IsModified = true;
                db.Entry(ticketsModel).Property(p => p.TicketTypeId).IsModified = true;
                db.Entry(ticketsModel).Property(p => p.TicketStatusId).IsModified = true;
                db.Entry(ticketsModel).Property(p => p.TicketPriorityId).IsModified = true;

                if ((ticketsModel.TicketStatusId == 4) && (ticketsModel.TicketPriorityId != 1004)) {
                    ticketsModel.TicketPriorityId = 1004;
                }

                db.Entry(ticketsModel).Property(p => p.UpdatedDate).IsModified = true;

                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.OwnerUserId = new SelectList(db.Users, "Id", "DisplayName", ticketsModel.OwnerUserId);
            ViewBag.AssignedToUserId = new SelectList(db.Users, "Id", "DisplayName", ticketsModel.AssignedToUserId);
            ViewBag.ProjectId = new SelectList(db.ProjectsData, "Id", "Name", ticketsModel.ProjectId);
            ViewBag.TicketPriorityId = new SelectList(db.TicketPrioritiesData, "Id", "Name", ticketsModel.TicketPriorityId);
            ViewBag.TicketStatusId = new SelectList(db.TicketStatusesData, "Id", "Name", ticketsModel.TicketStatusId);
            ViewBag.TicketTypeId = new SelectList(db.TicketTypesData, "Id", "Name", ticketsModel.TicketTypeId);

            return View(ticketsModel);
        }