private FIT_RESULT addToRoster(WeekRoster roster, Child currentChild, AttendanceRequest bringWish)
        {
            List<Child> children = roster.getChildren(bringWish.Dayparts);
            List<Caregiver> caregivers = roster.getCaregivers(bringWish.Dayparts);
            if (children.Count >= 13) // TODO: remove magic numbers
                return FIT_RESULT.FULL;
            if (children.Count + 1 - caregivers.Count * 5 > 0) // TODO: remove magic numbers
                return FIT_RESULT.INSUFFICIENT_CAREGIVERS;
            // TODO: max 3 babies

            roster.addChild(bringWish.Dayparts, currentChild);
            return FIT_RESULT.SUCCESS;
        }
 private bool addCaregiver(WeekRoster roster, List<Caregiver> caregivers, AttendanceRequest bringWish)
 {
     List<Caregiver> rosteredCaregivers = roster.getCaregivers();            
     // first see if we can add a new parent before shifting            
     Caregiver availableCaregiver = getAvailableCaregiver(caregivers.Except(rosteredCaregivers).ToList(), bringWish);
     if (availableCaregiver != null)
     {
         roster.addCaregiver(bringWish.Dayparts, availableCaregiver);
         return true;
     }
     else
     {
         return shiftCaregiver(roster, caregivers, rosteredCaregivers, bringWish);
     }
 }
        public WeekRoster getRoster(List<Caregiver> caregivers, List<Child> children)
        {
            WeekRoster roster = new WeekRoster();

            foreach(Child currentChild in children)
            {
                //There are many AttendanceRequest,.. todo select period that matters.
                //var period = currentChild.AttendanceRequest.FirstOrDefault();

                //foreach (DayPart daypart in period.Dayparts.ToParts())
                //AttendanceRequest bringWish = new AttendanceRequest(daypart);
                foreach (AttendanceRequest bringWish in currentChild.AttendanceRequest)
                {
                    
                    FIT_RESULT result = addToRoster(roster, currentChild, bringWish);
                    switch (result)
                    {
                        case FIT_RESULT.FULL:
                            if (shiftChild(roster, bringWish))
                                result = addToRoster(roster, currentChild, bringWish);
                            break; // TODO I don't want to break here, as there might not be sufficient parents now, but cannot reset result of course, maybe use stacked ifs instead of switch?
                        case FIT_RESULT.INSUFFICIENT_CAREGIVERS:
                            if (addCaregiver(roster, caregivers, bringWish))
                                result = addToRoster(roster, currentChild, bringWish);
                            break;
                        default:
                            break;
                    }
                    if (result != FIT_RESULT.SUCCESS)
                    {
                        // could not place child, error or report and go on and let human fix it?
                        Console.WriteLine("Failure: " + result + " for child " + currentChild);
                    }
                }
            }

            return roster;
        }
 private bool shiftCaregiver(WeekRoster roster, List<Caregiver> parents, List<Caregiver> rosteredParents, AttendanceRequest bringWish)
 {
     // TODO: see if a parent can move to this day, put another on that day and move, return true on success
     // TODO: check if not exceeding max number with adding the parent's children
     return false;
 }
 private bool shiftChild(WeekRoster roster, AttendanceRequest bringWish)
 {
     // TODO: see if a child can move away from this day, put it there, return true on success
     return false;
 }