/// <summary>
 /// Creates an RSVP for a dinner
 /// </summary>
 /// <param name="rsvp">
 /// The rsvp object
 /// </param>
 /// <returns>
 /// The updated rsvp object
 /// </returns>
 public Rsvp CreateRsvp(Rsvp rsvp)
 {
     using (NerdDinnersDb nerdDinnersDb = new NerdDinnersDb())
     {
         nerdDinnersDb.RSVPs.Add(rsvp);
         nerdDinnersDb.SaveChanges();
         return rsvp;
     }
 }
 /// <summary>
 /// Creates a dinner
 /// </summary>
 /// <param name="dinner">
 /// The dinner.
 /// </param>
 /// <returns>
 /// the dinner we created
 /// </returns>
 public Dinner CreateDinner(Dinner dinner)
 {
     using (NerdDinnersDb nerdDinnersDb = new NerdDinnersDb())
     {
         nerdDinnersDb.Dinners.Add(dinner);
         nerdDinnersDb.SaveChanges();
         return dinner;
     }
 }
        /// <summary>
        /// Delete Dinner
        /// </summary>
        /// <param name="dinnerId">
        /// The dinner id.
        /// </param>
        public void DeleteDinner(int dinnerId)
        {
            using (NerdDinnersDb nerdDinnersDb = new NerdDinnersDb())
            {
                var query = from dinners in nerdDinnersDb.Dinners
                            where dinners.DinnerId.Equals(dinnerId)
                            select dinners;
                var dinner = query.FirstOrDefault();

                nerdDinnersDb.Dinners.Remove(dinner);
                nerdDinnersDb.SaveChanges();
            }
        }
        /// <summary>
        /// Returns one dinner
        /// </summary>
        /// <param name="dinnerId">
        /// The dinner id.
        /// </param>
        /// <returns>
        /// Returns a dinner
        /// </returns>
        public Dinner GetDinner(int dinnerId)
        {
            using (NerdDinnersDb nerdDinnersDb = new NerdDinnersDb())
            {
                var query = from dinners in nerdDinnersDb.Dinners
                            where dinners.DinnerId.Equals(dinnerId)
                            select dinners;

                var dinner = query.FirstOrDefault();

                var rsvpQuery = from r in nerdDinnersDb.RSVPs where r.DinnerId == dinnerId select r;

                dinner.RsvpCount = rsvpQuery.Count();

                return dinner;
            }
        }
        /// <summary>
        /// Update Dinner
        /// </summary>
        /// <param name="dinner">
        /// The dinner.
        /// </param>
        /// <returns>
        /// Returns a Dinner
        /// </returns>
        public Dinner UpdateDinner(Dinner dinner)
        {
            using (NerdDinnersDb nerdDinnersDb = new NerdDinnersDb())
            {
                nerdDinnersDb.Dinners.Attach(dinner);
                nerdDinnersDb.ChangeObjectState(dinner, System.Data.EntityState.Modified);
                nerdDinnersDb.SaveChanges();
            }

            return dinner;
        }
        /// <summary>
        /// Returns a filtered set of RSVPs
        /// </summary>
        /// <param name="dinnerId">
        /// The dinner id.
        /// </param>
        /// <param name="start">
        /// The start.
        /// </param>
        /// <param name="count">
        /// The count.
        /// </param>
        /// <param name="filter">
        /// The filter.
        /// </param>
        /// <param name="sortType">
        /// The sort type.
        /// </param>
        /// <param name="sortColumn">
        /// The sort column.
        /// </param>
        /// <returns>
        /// A set of RSVPs
        /// </returns>
        public RsvpSet GetFilteredRSVPs(int dinnerId, int start, int count, string filter, string sortType, string sortColumn)
        {
            using (NerdDinnersDb nerdDinnersDb = new NerdDinnersDb())
            {
                var rsvps = nerdDinnersDb.RSVPs.Where(a => a.DinnerId == dinnerId);

                var totalCount = rsvps.Count();

                var filteredQuery = rsvps.AsQueryable();
                if (!string.IsNullOrEmpty(filter))
                {
                    filteredQuery =
                        from d in rsvps
                        where d.AttendeeEmail.Contains(filter)
                        select d;
                }

                var filteredCount = filteredQuery.Count();
                var sortColumnLower = sortColumn.ToLower();
                var orderingFunction = new Func<Rsvp, IComparable>(d => d.AttendeeEmail);

                List<Rsvp> sortedRSVPs;
                if (sortType == "asc")
                {
                    sortedRSVPs = (
                        from d in filteredQuery
                        select d).OrderBy(orderingFunction).ToList();
                }
                else if (sortType == "desc")
                {
                    sortedRSVPs =
                        (from d in filteredQuery
                         select d).OrderByDescending(orderingFunction).ToList();
                }
                else
                {
                    sortedRSVPs = filteredQuery.ToList();
                }

                var pageRSVPs = sortedRSVPs.Skip(start).Take(count);

                var result = new RsvpSet()
                {
                    Rsvps = pageRSVPs.ToList(),
                    FilteredRsvpCount = filteredCount,
                    TotalRsvpCount = totalCount
                };
                return result;
            }
        }
        /// <summary>
        /// Get Filtered Dinners
        /// </summary>
        /// <param name="start">
        /// The start.
        /// </param>
        /// <param name="count">
        /// The count.
        /// </param>
        /// <param name="filter">
        /// The filter.
        /// </param>
        /// <param name="sortType">
        /// The sort type.
        /// </param>
        /// <param name="sortColumn">
        /// The sort column.
        /// </param>
        /// <returns>
        /// A Dinenr Set
        /// </returns>
        public DinnerSet GetFilteredDinners(int start, int count, string filter, string sortType, string sortColumn)
        {
            using (NerdDinnersDb nerdDinnersDb = new NerdDinnersDb())
            {
                var totalDinnerCount = nerdDinnersDb.Dinners.Count();

                var filteredDinnerQuery = nerdDinnersDb.Dinners.AsQueryable();
                if (!string.IsNullOrEmpty(filter))
                {
                    filteredDinnerQuery =
                        from d in nerdDinnersDb.Dinners
                        where d.Title.Contains(filter)
                              || d.Address.Contains(filter)
                              || d.HostedBy.Contains(filter)
                        select d;
                }

                var filteredDinnerCount = filteredDinnerQuery.Count();
                var sortColumnLower = sortColumn.ToLower();

                var orderingFunction =
                  sortColumnLower == "dinnerid" ? new Func<Dinner, IComparable>(d => d.DinnerId)
                      : sortColumnLower == "title" ? new Func<Dinner, IComparable>(d => d.Title)
                            : sortColumnLower == "address" ? new Func<Dinner, IComparable>(d => d.Address)
                                  : sortColumnLower == "eventdate" ? new Func<Dinner, IComparable>(d => d.EventDate)
                                      : new Func<Dinner, IComparable>(d => d.Country);

                List<Dinner> sortedDinners;
                if (sortType == "asc")
                {
                    sortedDinners = (
                        from d in filteredDinnerQuery
                        select d).OrderBy(orderingFunction).ToList();
                }
                else if (sortType == "desc")
                {
                    sortedDinners =
                        (from d in filteredDinnerQuery
                        select d).OrderByDescending(orderingFunction).ToList();
                }
                else
                {
                    sortedDinners = filteredDinnerQuery.ToList();
                }

                var pageDinners = sortedDinners.Skip(start).Take(count);

                var result = new DinnerSet()
                                 {
                                     Dinners = pageDinners.ToList(),
                                     FilteredDinnerCount = filteredDinnerCount,
                                     TotalDinnerCount = totalDinnerCount
                                 };
                return result;
            }
        }
 /// <summary>
 /// Get Dinners
 /// </summary>
 /// <returns>
 /// Returns a list of diners
 /// </returns>
 public List<Dinner> GetDinners()
 {
     using (NerdDinnersDb nerdDinnersDb = new NerdDinnersDb())
     {
         var query = from dinners in nerdDinnersDb.Dinners
                     select dinners;
         return query.ToList();
     }
 }