// POST: api/Reception
        public bool Post([FromBody]EventDTO request)
        {
            using (var dbContext = new WeddingSiteBuilderEntities())
            {
                var wedding = dbContext.Weddings.FirstOrDefault(w => w.WeddingID == request.WeddingId);
                if (wedding != null)
                {
                    if (wedding.Receptions.Any())
                    {
                        var reception = wedding.Receptions.FirstOrDefault();
                        if (!string.IsNullOrWhiteSpace(request.LocationName)) reception.LocationName = request.LocationName;
                        if (!string.IsNullOrWhiteSpace(request.Address1)) reception.Address1 = request.Address1;
                        if (!string.IsNullOrWhiteSpace(request.City)) reception.City = request.City;
                        if (!string.IsNullOrWhiteSpace(request.State)) reception.StateProv = request.State;
                        if (!string.IsNullOrWhiteSpace(request.Zip)) reception.ZipCode = request.Zip;
                        if (request.Date != null) reception.ReceptionDateTime = request.Date.Value;

                        dbContext.SaveChanges();
                        return true;
                    }
                    wedding.Receptions.Add(new Reception()
                    {
                        LocationName = request.LocationName,
                        Address1 = request.Address1,
                        City = request.City,
                        StateProv = request.State,
                        ZipCode = request.Zip,
                        ReceptionDateTime = request.Date.HasValue ? request.Date.Value : DateTime.Now
                    });
                    var changesSaved = dbContext.SaveChanges();
                    return changesSaved == 1;
                }
                return false;
            }
        }
        // GET: api/RSVP/5
        public List<AttendeeWithRSVP> Get(long WeddingId)
        {
            if (WeddingId != 0)
            {
                using (var dbContext = new WeddingSiteBuilderEntities())
                {
                    var attendees = new List<AttendeeWithRSVP>();

                    dbContext.Attendees
                        .Where(a => a.WeddingID == WeddingId && !(a.WeddingRole == "Bride" || a.WeddingRole == "Groom" || a.PartyMember == true))
                        .ToList()
                        .ForEach(a =>
                        {
                            var rsvp = dbContext.RSVPLinks.FirstOrDefault(r => r.AttendeeID == a.AttendeeID);
                            if (rsvp != null)
                            {
                                var attendee = new AttendeeWithRSVP
                                {
                                    Attendee = new AttendeeModel(a),
                                    RSVP = new RSVPLinkModel(rsvp)
                                };
                                attendees.Add(attendee);
                            }
                        });
                    return attendees;
                }
            }
            else
            {
                return new List<AttendeeWithRSVP>();
            }
        }
        // GET: api/Attendee/5
        public List<Attendee> Get(long WeddingId, string option)
        {
            var attendees = new List<Attendee>();

            using(var dbContext = new WeddingSiteBuilderEntities())
            {
                var retrievedAttendees = dbContext.Attendees.Include("Person").Where(a => a.WeddingID == WeddingId).ToList();

                if(option == "couple")
                {
                    retrievedAttendees = retrievedAttendees.Where(a => a.WeddingRole == "Bride" || a.WeddingRole == "Groom").ToList();
                }
                else if(option == "party")
                {
                    retrievedAttendees = retrievedAttendees.Where(a => a.PartyMember == true).ToList();
                }
                else
                {
                    retrievedAttendees = retrievedAttendees.Where(a => !(a.WeddingRole == "Bride" || a.WeddingRole == "Groom"  || a.PartyMember == true)).ToList();
                }

                attendees.AddRange(retrievedAttendees);
            }

            return attendees;
        }
 // GET: api/Ceremony/5
 public Ceremony Get(long WeddingId)
 {
     using (var dbContext = new WeddingSiteBuilderEntities())
     {
         if(WeddingId != 0)
         {
             return dbContext.Ceremonies.FirstOrDefault(c => c.WeddingID == WeddingId);
         }
         return null;
     }
 }
        // GET: api/Reception/5
        public Reception Get(int WeddingId)
        {
            using(var dbContext = new WeddingSiteBuilderEntities())
            {
                var wedding = dbContext.Weddings.FirstOrDefault(w => w.WeddingID == WeddingId);
                if(wedding != null)
                {
                    return wedding.Receptions.FirstOrDefault();
                }

                return null;
            }
        }
        // POST: api/Registration
        public long Post([FromBody]RegistrationDTO request)
        {
            int changesSaved = 0;
            try
            {
                using (var dbContext = new WeddingSiteBuilderEntities())
                {
                    var person = new Person()
                    {
                        Email = request.Email,
                        Password = request.Password,
                        FirstName = request.FirstName,
                        LastName = request.LastName
                    };
                    dbContext.People.Add(person);

                    var wedding = new Wedding();

                    dbContext.Weddings.Add(wedding);

                    changesSaved = dbContext.SaveChanges();

                    var attendee = new Attendee()
                    {
                        WeddingID = wedding.WeddingID,
                        PersonID = person.PersonID,
                        WeddingRole = request.BrideOrGroom == "Bride" ? "Bride" : "Groom",
                        Side = request.BrideOrGroom == "Bride" ? "Bride" : "Groom"
                    };

                    dbContext.Attendees.Add(attendee);

                    changesSaved += dbContext.SaveChanges();

                    if(changesSaved == 3)
                    {
                        return wedding.WeddingID;
                    }
                    else
                    {
                        return 0;
                    }
                }
            }
            catch(Exception)
            {
                return 0;
            }
        }
        // Post: api/RSVP?RSVPLinkId=3&Count=2&Accepted=false
        public bool Post(long RSVPLinkId, int Count, bool Accepted)
        {
            using (var dbContext = new WeddingSiteBuilderEntities())
            {
                var rsvp = dbContext.RSVPLinks.FirstOrDefault(r => r.RSVPLinkID == RSVPLinkId);
                if (rsvp == null) return false;

                var attendee = dbContext.Attendees.FirstOrDefault(a => a.AttendeeID == rsvp.AttendeeID);
                attendee.NumberofRSVPs = Count;
                attendee.Attending = Accepted;
                rsvp.IsAnswered = true;

                dbContext.SaveChanges();
                return true;
            }
        }
        // GET: api/RSVP/1652c050-6c56-48be-98f1-a899e387078f
        public AttendeeWithRSVP Get(Guid Id)
        {
            using(var dbContext = new WeddingSiteBuilderEntities())
            {
                var rsvp = dbContext.RSVPLinks.FirstOrDefault(r => r.GuidToken == Id);
                var att = dbContext.Attendees.FirstOrDefault(a => a.AttendeeID == rsvp.AttendeeID);
                if (rsvp == null || att == null) return null;
                var attendee = new AttendeeWithRSVP
                {
                    Attendee = new AttendeeModel(att),
                    RSVP = new RSVPLinkModel(rsvp)
                };

                return attendee;
            }
        }
 // GET: api/WeddingCouple/5
 public bool Get(int id)
 {
     int changesSaved = 0;
     using (var dbContext = new WeddingSiteBuilderEntities())
     {
         var wedding = new Wedding()
         {
             WeddingID = id,
             CoupleStory = "Oh My So, romantic",
             CreateDate = DateTime.Now,
             LastUpdated = DateTime.Now
         };
         dbContext.Weddings.Add(wedding);
         changesSaved = dbContext.SaveChanges();
     }
     return changesSaved > 0;
 }
        // GET: api/Login?userName=dummy&password=pword
        public long Get(string Email, string Password)
        {
            using (var dbContext = new WeddingSiteBuilderEntities())
            {
                var existingLogin = dbContext.People.Where(p => p.Email == Email && p.Password == Password).FirstOrDefault();
                if(existingLogin != null)
                {
                    var attendee = dbContext.Attendees.Where(a => a.PersonID == existingLogin.PersonID).FirstOrDefault();
                    if(attendee != null)
                    {
                        return attendee.WeddingID;
                    }
                    return 0;
                }

                return 0;
            }
        }
        // POST: api/RSVP
        public AttendeeWithRSVP Post([FromBody]AttendeeDTO request)
        {
            using(var dbContext = new WeddingSiteBuilderEntities())
            {
                var attendee = new Attendee()
                {
                    Side = request.Side,
                    WeddingID = request.WeddingId,
                    Person = new Person()
                    {
                        FirstName = request.FirstName,
                        LastName = request.LastName,
                        Email = request.Email
                    }
                };

                dbContext.Attendees.Add(attendee);
                var changesSaved = dbContext.SaveChanges();

                var rsvp = new RSVPLink()
                {
                    AttendeeID = attendee.AttendeeID,
                    GuidToken = new Guid()
                };

                dbContext.RSVPLinks.Add(rsvp);
                changesSaved += dbContext.SaveChanges();

                var attendeeWithRSVP = (AttendeeWithRSVP)attendee;
                attendeeWithRSVP.RSVP = rsvp;

                SendRSVPEmail(attendeeWithRSVP, dbContext);

                return attendeeWithRSVP;
            }
        }
        // POST: api/Attendee
        public bool Post([FromBody]AttendeeDTO request)
        {
            using(var dbContext = new WeddingSiteBuilderEntities())
            {
                var wedding = dbContext.Weddings.FirstOrDefault(w => w.WeddingID == request.WeddingId);
                if (wedding != null)
                {
                    if (request.AttendeeId.HasValue)
                    {
                        var existingAttendee = dbContext.Attendees.FirstOrDefault(a => a.AttendeeID == request.AttendeeId.Value);
                        if (existingAttendee != null)
                        {
                            if (!string.IsNullOrWhiteSpace(request.FirstName)) existingAttendee.Person.FirstName = request.FirstName;
                            if (!string.IsNullOrWhiteSpace(request.LastName)) existingAttendee.Person.LastName = request.LastName;
                            if (!string.IsNullOrWhiteSpace(request.Email)) existingAttendee.Person.Email = request.Email;
                            if (!string.IsNullOrWhiteSpace(request.Relationship)) existingAttendee.Relationship = request.Relationship;
                            if (!string.IsNullOrWhiteSpace(request.Role)) existingAttendee.WeddingRole = request.Role;
                            if (request.Role.ToLower() == "bride" || request.Role.ToLower() == "groom")
                            {
                                existingAttendee.Side = request.Role;
                            }
                            else if (request.Side.ToLower() == "bride" || request.Side.ToLower() == "groom")
                            {
                                existingAttendee.Side = request.Side;
                            }
                            if (!string.IsNullOrWhiteSpace(request.Blurb)) existingAttendee.PartyMemberBlurb = request.Blurb;
                            existingAttendee.PartyMember = request.PartyMember;

                            try
                            {
                                var changesSaved = dbContext.SaveChanges();
                                return true;
                            }
                            catch (Exception)
                            {
                                return false;
                            }

                        }
                    }
                    else if (!(string.IsNullOrWhiteSpace(request.FirstName) || string.IsNullOrWhiteSpace(request.LastName)))
                    {
                        if (request.Role.ToLower() == "bride" || request.Role.ToLower() == "groom")
                        {
                            request.Side = request.Role;
                        }
                        else if (!(request.Side.ToLower() == "bride" || request.Side.ToLower() == "groom"))
                        {
                            request.Side = "Bride";
                        }

                        var attendee = new Attendee()
                        {
                            Side = request.Side,
                            WeddingRole = request.Role,
                            Relationship = request.Relationship,
                            PartyMemberBlurb = request.Blurb,
                            PartyMember = request.PartyMember,
                            WeddingID = request.WeddingId,
                            Person = new Person()
                            {
                                FirstName = request.FirstName,
                                LastName = request.LastName,
                                Email = request.Email
                            }
                        };

                        dbContext.Attendees.Add(attendee);
                        var changesSaved = dbContext.SaveChanges();
                        return (changesSaved == 2);
                    }
                }
                return false;
            }
        }
        // POST: api/RSVP
        public AttendeeWithRSVP Post([FromBody]AttendeeDTO request)
        {
            using(var dbContext = new WeddingSiteBuilderEntities())
            {
                var attendee = new Attendee()
                {
                    Side = request.Side,
                    WeddingID = request.WeddingId,
                    Person = new Person()
                    {
                        FirstName = request.FirstName,
                        LastName = request.LastName,
                        Email = request.Email
                    }
                };
                try
                {
                    dbContext.Attendees.Add(attendee);
                    var changesSaved = dbContext.SaveChanges();

                    var rsvp = new RSVPLink()
                    {
                        AttendeeID = attendee.AttendeeID,
                        GuidToken = Guid.NewGuid(),
                        RSVPNameBlub = string.Empty,
                        IsAnswered = false
                    };

                    dbContext.RSVPLinks.Add(rsvp);
                    changesSaved += dbContext.SaveChanges();

                    var attendeeWithRSVP = new AttendeeWithRSVP
                    {
                        Attendee = new AttendeeModel(attendee),
                        RSVP = new RSVPLinkModel(rsvp)
                    };

                    SendRSVPEmail(attendee, rsvp, dbContext);

                    return attendeeWithRSVP;
                }
                catch(Exception)
                {
                    return null;
                }
            }
        }
        private void SendRSVPEmail(Attendee attendee, RSVPLink rsvp, WeddingSiteBuilderEntities dbContext)
        {
            var couple = dbContext.Attendees.Where(a => a.WeddingID == attendee.WeddingID && (a.WeddingRole == "Bride" || a.WeddingRole == "Groom")).ToList();
            string subject;

            if(couple.Count() == 1)
            {
                var herOrHis = couple.FirstOrDefault().WeddingRole == "Bride" ? "her" : "his";
                subject = "Hey " + attendee.Person.FirstName + ", let {0} know if you'll be coming to " + herOrHis + " wedding";
            }
            else
            {
                subject = "Hey " + attendee.Person.FirstName + ", let {0} and {1} know if you'll be coming to their wedding";
            }

            var message = new StringBuilder();
            message.AppendLine("RSVP for the wedding by clicking on the link below.");
            message.AppendLine(string.Format("http://localhost:59998/Views/respondtorsvp.html?token={0}", rsvp.GuidToken));

            EmailService.Instance.SendEmail(
                attendee.Person.Email,
                couple.Count() == 1 ? string.Format(subject, couple.FirstOrDefault().Person.FirstName) : string.Format(subject, couple.FirstOrDefault().Person.FirstName, couple.LastOrDefault().Person.FirstName),
                message.ToString());
        }
        // PUT: api/RSVP/5
        public bool Put(int id)
        {
            try
            {
                using (var dbContext = new WeddingSiteBuilderEntities())
                {
                    var rsvp = dbContext.RSVPLinks.FirstOrDefault(r => r.RSVPLinkID == id);
                    var att = dbContext.Attendees.FirstOrDefault(a => a.AttendeeID == rsvp.AttendeeID);
                    if (rsvp == null || att == null) return false;

                    SendRSVPEmail(att, rsvp, dbContext);
                    return true;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }