public int GetAvailableTerms(Session openedSession, DateTime date, RemainingSession remainingSession)
        {
            var day       = date.DayOfWeek;
            var startTime = date.TimeOfDay;

            Session nextSession = null;

            var sessions = SessionDao.FindByScheduleId(LastOpenedSchedule.Id);

            foreach (var session in sessions)
            {
                // sesion is on the same day or in same classroom
                if (session.Day == day && session.Classroom.Id == Classroom.Id)
                {
                    var sessionStart = session.Time.TimeOfDay;
                    var sessionEnd   = sessionStart.Add(new TimeSpan(0, Subject.TermLenght * session.Terms, 0));

                    if (openedSession != null && openedSession.Time.TimeOfDay.CompareTo(sessionStart) == 0)
                    {
                        continue;
                    }

                    if (startTime.CompareTo(sessionStart) >= 0 && startTime.CompareTo(sessionEnd) < 0)
                    {
                        return(-1);
                    }
                    if (startTime.CompareTo(sessionStart) < 0)
                    {
                        if (nextSession == null || sessionStart.CompareTo(nextSession.Time.TimeOfDay) < 0)
                        {
                            nextSession = session;
                        }
                    }
                }
            }

            TimeSpan diff;

            if (nextSession != null)
            {
                var nextSessionStart = nextSession.Time.TimeOfDay;
                diff = nextSessionStart - startTime;
            }
            else
            {
                var maxTimeSpan = new TimeSpan(22, 0, 0);
                diff = maxTimeSpan - startTime;
            }

            var diffMinutes = diff.TotalMinutes;
            var maxTerms    = (int)(diffMinutes / Subject.TermLenght);

            if (openedSession != null)
            {
                return(maxTerms > remainingSession.RemainingTerms + openedSession.Terms
                    ? remainingSession.RemainingTerms + +openedSession.Terms
                    : maxTerms);
            }
            return(maxTerms > remainingSession.RemainingTerms ? remainingSession.RemainingTerms : maxTerms);
        }
        public void InitSessions()
        {
            ScheduleAppointments.Clear();

            var sessions = SessionDao.FindByScheduleId(Schedule.Id);

            foreach (var session in sessions)
            {
                var sessionAppoinment = new SessionAppointment()
                {
                    Session        = session,
                    Subject        = session.Subject.Name,
                    StartTime      = session.Time,
                    EndTime        = session.Time + TimeSpan.FromMinutes(session.Terms * Subject.TermLenght),
                    RecurrenceRule = "week"
                };
                ScheduleAppointments.Add(sessionAppoinment);
            }
        }
        public void InitRemainigSessions()
        {
            RemainingSessions.Clear();
            if (_classroom == null)
            {
                return;
            }

            var classroom = ClassroomDao.FindById(_classroom.Id);

            var schedule           = LastOpenedSchedule;
            var subjects           = SubjectDao.FindAll();
            var sessionsDictionary = subjects.ToDictionary(subject => subject.Id, subject => new RemainingSession()
            {
                RemainingTerms = subject.RequiredTerms,
                Subject        = subject
            });

            var sessions = SessionDao.FindByScheduleId(schedule.Id);

            foreach (var session in sessions)
            {
                var currSession = sessionsDictionary[session.Subject.Id];
                currSession.RemainingTerms -= session.Terms;
            }

            RemainingSessions.Clear();
            var sessionList = sessionsDictionary.ToList();

            sessionList.Sort(
                (pair1, pair2) =>
                String.Compare(pair1.Value.Subject.Name, pair2.Value.Subject.Name, StringComparison.Ordinal));
            foreach (var remainingSession in sessionList)
            {
                var session = remainingSession.Value;
                session.Compatible = classroom.CanHostSubject(session.Subject);
                RemainingSessions.Add(session);
            }
        }