private void MeetingAssignmentsGridBox_CellContentClick(object sender, DataGridViewCellEventArgs e)
 {
     MeetingAssignment meetassign = manager.MeetingAssignmentByMeetingAssignmentId(Convert.ToInt32(MeetingAssignmentsGridBox.Rows[e.RowIndex].Cells[0].Value));
     SelectedMeetingAssignment = meetassign;
        List<Member> mavailabe = manager.MembersAvailable(meetassign.AssignmentId,meetassign.Meeting.MeetingDate);
     chooseMemberBox.Visible = true;
     AssignmentLabel.Visible = true;
     UpdateMemberAssignment.Visible = true;
     AssignmentLabel.Text = "Choose member for " + meetassign.Assignment.Label;
     chooseMemberBox.DataSource = mavailabe;
     chooseMemberBox.ValueMember = "Id";
     chooseMemberBox.DisplayMember = "LastName";
 }
        private void MeetingAssignmentsGridBox_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            MeetingAssignment meetassign = manager.MeetingAssignmentByMeetingAssignmentId(Convert.ToInt32(MeetingAssignmentsGridBox.Rows[e.RowIndex].Cells[0].Value));

            SelectedMeetingAssignment = meetassign;
            List <Member> mavailabe = manager.MembersAvailable(meetassign.AssignmentId, meetassign.Meeting.MeetingDate);

            chooseMemberBox.Visible        = true;
            AssignmentLabel.Visible        = true;
            UpdateMemberAssignment.Visible = true;
            AssignmentLabel.Text           = "Choose member for " + meetassign.Assignment.Label;
            chooseMemberBox.DataSource     = mavailabe;
            chooseMemberBox.ValueMember    = "Id";
            chooseMemberBox.DisplayMember  = "LastName";
        }
        private void UpdateMemberAssignment_Click(object sender, EventArgs e)
        {
            List<MeetingAssignment> oldMeetingAssignment = SelectedMeetingAssignment.Member.MeetingAssignments.ToList();
            oldMeetingAssignment = oldMeetingAssignment.Where(z => z.ReferanceMark == true).ToList();
            if(oldMeetingAssignment.Count!=0)
            {
                oldMeetingAssignment.OrderBy(o => o.Meeting.MeetingDate).ToList();
                oldMeetingAssignment.Last().ReferanceMark = false;
                manager.UpdateMeetingAssignment(oldMeetingAssignment.Last());
            }

            SelectedMeetingAssignment.MemberId = Convert.ToInt32(chooseMemberBox.SelectedValue);
            SelectedMeetingAssignment.ReferanceMark = false;
            SelectedMeetingAssignment = manager.UpdateMeetingAssignment(SelectedMeetingAssignment);
            UpdateMemberAssignmentBox(SelectedMeetingAssignment.MeetingId);
        }
        private void UpdateMemberAssignment_Click(object sender, EventArgs e)
        {
            List <MeetingAssignment> oldMeetingAssignment = SelectedMeetingAssignment.Member.MeetingAssignments.ToList();

            oldMeetingAssignment = oldMeetingAssignment.Where(z => z.ReferanceMark == true).ToList();
            if (oldMeetingAssignment.Count != 0)
            {
                oldMeetingAssignment.OrderBy(o => o.Meeting.MeetingDate).ToList();
                oldMeetingAssignment.Last().ReferanceMark = false;
                manager.UpdateMeetingAssignment(oldMeetingAssignment.Last());
            }


            SelectedMeetingAssignment.MemberId      = Convert.ToInt32(chooseMemberBox.SelectedValue);
            SelectedMeetingAssignment.ReferanceMark = false;
            SelectedMeetingAssignment = manager.UpdateMeetingAssignment(SelectedMeetingAssignment);
            UpdateMemberAssignmentBox(SelectedMeetingAssignment.MeetingId);
        }
        public MeetingAssignment UpdateMeetingAssignment(MeetingAssignment meetingAssignment)
        {
            MeetingAssignment ma = MeetingAssignmentByMeetingAssignmentId(meetingAssignment.Id);
            ma.MeetingId = meetingAssignment.MeetingId;
            ma.AssignmentId = meetingAssignment.AssignmentId;
            ma.MemberId = meetingAssignment.MemberId;
            ma.ReferanceMark = meetingAssignment.ReferanceMark;
            ma.ScheduleDateId = meetingAssignment.ScheduleDateId;
            ma.UpdateDate = DateTime.Now;

            repository.SaveChanges();
            return ma;
        }
        public Member NextMemberToAssign(List<Member> membersAvailable, Meeting currentMeeting, Assignment currentAssignment)
        {
            List<Member> newMembers = (from mem in membersAvailable
                                       where mem.MeetingAssignments.Count == 0
                                       select mem).ToList();

            if (newMembers.Count != 0)
            {
                newMembers = newMembers.OrderBy(z => z.FirstName).ToList();
                return newMembers[0];
            }

            int meetingCountToBeat = new int();
            int meetingCounter = 0;
            Member currentlySelected = new Member();
            MeetingAssignment mLastMeetingAssignment = new MeetingAssignment();
            List<Member> alreadyAssigned = (from l in currentMeeting.MeetingAssignments
                                            select l.Member).ToList();
            List<Meeting> allMeeting = (from v in repository.Meetings
                                        where v.CongregationId == currentMeeting.CongregationId
                                        select v).ToList();
            allMeeting = allMeeting.OrderByDescending(o => o.MeetingDate).ToList();
            int index = allMeeting.IndexOf(currentMeeting);
            List<Member> go = (from goat in allMeeting[index + 1].MeetingAssignments
                               select goat.Member).ToList();

            foreach (Member m in membersAvailable)
            {
                List<MeetingAssignment> selectedMAssignments = (from d in repository.MeetingAssignments
                                                                where d.MemberId == m.Id
                                                                select d).ToList();
                selectedMAssignments = selectedMAssignments.OrderByDescending(o => o.Meeting.MeetingDate).ToList();
                if (alreadyAssigned.Any(p => p.Id == m.Id))//skips if they are already assigned or previous assignment was same assignment.
                {
                    continue;
                }
                if (selectedMAssignments[0].AssignmentId == currentAssignment.Id && m.MemberAssignments.Count > 2)
                {
                    continue;
                }

                foreach (DateTime d in EachDayLoop(selectedMAssignments[0].Meeting.MeetingDate.AddDays(1), currentMeeting.MeetingDate.AddDays(-1)))
                {
                    if (Convert.ToString(d.DayOfWeek) == m.Congregation.PublicMeetingDay || Convert.ToString(d.DayOfWeek) == m.Congregation.WeekMeetingDay)
                    {
                        meetingCounter++;
                    }
                }
                if (currentlySelected.Id == 0)
                {
                    meetingCountToBeat = meetingCounter;
                    currentlySelected = m;
                    mLastMeetingAssignment = selectedMAssignments[0];
                    meetingCounter = 0;
                    continue;
                }
                if (meetingCounter > meetingCountToBeat)
                {
                    meetingCountToBeat = meetingCounter;
                    currentlySelected = m;
                    mLastMeetingAssignment = selectedMAssignments[0];
                    meetingCounter = 0;
                }

                if (meetingCounter == meetingCountToBeat)
                {
                    if (selectedMAssignments[0].Assignment.Label != currentAssignment.Label && mLastMeetingAssignment.Assignment.Label == currentAssignment.Label)
                    {
                        currentlySelected = m;
                        mLastMeetingAssignment = selectedMAssignments[0];
                    }

                }
                meetingCounter = 0;
                continue;

            }
            return currentlySelected;
        }
        public MeetingAssignment CreateMeetingAssignment(int meetingId, int memberId, int assignmentId, int congregationId, int scheduleDateId)
        {
            MeetingAssignment meetingassignment = new MeetingAssignment();
            meetingassignment.MeetingId = meetingId;
            meetingassignment.MemberId = memberId;
            meetingassignment.AssignmentId = assignmentId;
            meetingassignment.CongregationId = congregationId;
            meetingassignment.ReferanceMark = false;
            meetingassignment.ScheduleDateId = scheduleDateId;
            meetingassignment.CreateDate = DateTime.Now;

            repository.MeetingAssignments.Add(meetingassignment);
            repository.SaveChanges();
            return meetingassignment;
        }