//TODO: This is written in a super stupid way. Needs re-writing :(
        public void TransferSignups(Event newEvent, out List <Signup> newReserves)
        {
            newReserves = new List <Signup>();
            if (newEvent.Signups.All(e => !e.IsRequired))
            {
                foreach (var signup in Signups)
                {
                    if (signup.IsFilled())
                    {
                        newEvent.Signups.Add(signup);
                    }
                }
                Signups = newEvent.Signups;
                return;
            }

            foreach (var signup in Signups)
            {
                if (!signup.IsFilled())
                {
                    continue;
                }

                if (signup.Role == Role.Maybe || signup.Role == Role.Reserve)
                {
                    //Don't add the same reserve or maybe more than once (if someone signed up in more than 1 role)
                    if (newEvent.Signups.Any(e => e.Role == signup.Role && e.UserId == signup.UserId))
                    {
                        continue;
                    }
                    newEvent.Signups.Add(new Signup(signup.Role, false, DateTime.UtcNow, signup.UserId));
                    continue;
                }

                var spotInNewEvent = newEvent.Signups.FirstOrDefault(e => e.Role == signup.Role && e.IsRequired && !e.IsFilled());
                if (spotInNewEvent != null)
                {
                    spotInNewEvent.UserId = signup.UserId;
                }
                else
                {
                    //Don't add the same reserve or maybe more than once (if someone signed up in more than 1 role)
                    if (newEvent.Signups.Any(e => e.Role == Role.Reserve && e.UserId == signup.UserId))
                    {
                        continue;
                    }
                    var newReserve = new Signup(Role.Reserve, false, DateTime.UtcNow, signup.UserId);
                    newEvent.Signups.Add(newReserve);
                    newReserves.Add(newReserve);
                }
            }
            Signups = newEvent.Signups;
        }
 public void RemoveSignup(Signup signupToRemove)
 {
     if (signupToRemove == null)
     {
         return;
     }
     if (signupToRemove.IsRequired == true)
     {
         signupToRemove.UserId = 0;
     }
     else
     {
         Signups.Remove(signupToRemove);
     }
 }
        public Signup GetNextReserve(Role priorityRole = Role.None)
        {
            Signup nextReserve = null;

            if (priorityRole != Role.None)
            {
                nextReserve = Signups.FirstOrDefault(e => e.Role == Role.Reserve && e.ReserveRole == priorityRole);
            }
            if (nextReserve == null)
            {
                nextReserve = Signups.FirstOrDefault(e => e.Role == Role.Reserve);
            }

            return(nextReserve);
        }
 public bool TryAddSignup(Signup signup)
 {
     if (signup.Role != Role.Maybe && signup.Role != Role.Reserve && Signups.Any(e => e.IsRequired == true))
     {
         var freeSlot = Signups.FirstOrDefault(e => e.Role == signup.Role && !e.IsFilled());
         if (freeSlot != null)
         {
             freeSlot.UserId = signup.UserId;
             return(true);
         }
         return(false);
     }
     else
     {
         Signups.Add(signup);
         return(true);
     }
 }