//
 public int sizeLessonComparator(Lesson l1, Lesson l2)
 {
     if (l1.getSize() > l2.getSize())
     {
         return(1);
     }
     else if (l1.getSize() < l2.getSize())
     {
         return(-1);
     }
     else
     {
         return(amountLessonComparator(l1, l2));
     }
 }
        public void crossSchoolTimeTables(SchoolTimeTable stt1, SchoolTimeTable stt2)
        {
            foreach (TimeTable tt1 in stt1.groupTimeTables)
            {
                TimeTable tt2 = null;

                foreach (TimeTable tt2_tmp in stt2.groupTimeTables)
                {
                    if (tt1.group.Equals(tt2_tmp.group))
                    {
                        tt2 = tt2_tmp;
                        break;
                    }
                }

                if (tt2 != null)
                {
                    //tt1.printTimeTable();
                    //tt2.printTimeTable();

                    List <TimeSlot> slots = getTheSameTimeSlotInTheSameLesson(tt1, tt2);

                    foreach (TimeSlot slot in slots)
                    {
                        Lesson lesson = tt1.getLesson(slot.day, slot.hour)[0];

                        if (lesson.getSize() == 1)
                        {
                            TimeTable teacherTimeTable = null;

                            foreach (TimeTable teacherTT in this.teacherTimeTables)
                            {
                                if (teacherTT.Equals(lesson.getTeacher()))
                                {
                                    teacherTimeTable = teacherTT;
                                    break;
                                }
                            }

                            TimeTable groupTimeTable = null;

                            foreach (TimeTable groupTT in this.groupTimeTables)
                            {
                                if (groupTT.Equals(lesson.getGroup()))
                                {
                                    groupTimeTable = groupTT;
                                    break;
                                }
                            }

                            teacherTimeTable.addLesson(lesson, slot.day, slot.hour);
                            groupTimeTable.addLesson(lesson, slot.day, slot.hour);
                        }
                    }
                }
            }

            lessons = getListOfLessonToInsert();
            this.generateSchoolTimeTable();

            //this.printTimeTable();
        }
        public Boolean removeLessonsAndFindNewPosition(Lesson lesson)
        {
            bool result = true;

            TimeTable                groupTT           = lesson.getGroup().getTimeTable();            //plan zajęć dla grupy szukanej lekcji
            TimeTable                teacherTT         = lesson.getTeacher().getTimeTable();          //plan zajec dla nauczyciela szukanej lekcji
            List <TimeSlot>          groupSlots        = groupTT.getFreeTimeSlot(lesson.getSize());   //wolne sloty grupy
            List <TimeSlot>          teacherSlots      = teacherTT.getFreeTimeSlot(lesson.getSize()); //wolne sloty nauczyciela
            List <FreeSlotsToLesson> freeSlotsToLesson = new List <FreeSlotsToLesson>();
            List <TimeSlot>          slotsToChange     = new List <TimeSlot>();
            TimeSlot bestSlot     = null;
            Lesson   lessonToMove = null;

            for (int d = 0; d < ConstVariable.NUMBER_OF_DAYS; d++)
            {
                for (int h = 0; h < ConstVariable.NUMBER_OF_SLOTS_IN_DAY; h++)
                {
                    ////pobranie wolnych sal i grupy/nauczyciela
                    ////porównanie wolnych slotów nauczyciela, grupy i sal
                    ////dodanie do listy
                    if (true)
                    {
                        slotsToChange.Add(new TimeSlot(d, h));
                    }
                }
            }

            bestSlot = slotsToChange[rand.Next(slotsToChange.Count - 1)];                         //wylosowanie z listy najlepszego slotu

            //wstawienie zmienianej lekcji
            lessonToMove = groupTT.getLesson(bestSlot.day, bestSlot.hour)[0];
            ////

            //usuniecie zmienianej lekcji z poprzedniej pozycji
            groupTT.removeLesson(lessonToMove, bestSlot.day, bestSlot.hour);
            teacherTT.removeLesson(lessonToMove, bestSlot.day, bestSlot.hour);

            ////room

            //wstawienie w wybrany slot lekcji do wstawienia
            groupTT.addLesson(lesson, bestSlot.day, bestSlot.hour);
            teacherTT.addLesson(lesson, bestSlot.day, bestSlot.hour);
            ////room


            return(result);

            /*
             * Boolean result = true;
             * Boolean isGroupHaveMoreSlots = true;
             * List<FreeSlotsToLesson> freeSlotsToLesson = new List<FreeSlotsToLesson>();
             *
             * TimeTable groupTT = lesson.getGroup().getTimeTable();                               //plan zajęć dla grupy szukanej lekcji
             * TimeTable teacherTT = lesson.getTeacher().getTimeTable();                           //plan zajec dla nauczyciela szukanej lekcji
             * List<TimeSlot> groupSlots = groupTT.getFreeTimeSlot(lesson.getSize());              //wolne sloty grupy
             * List<TimeSlot> teacherSlots = teacherTT.getFreeTimeSlot(lesson.getSize());          //wolne sloty nauczyciela
             *
             * List<FreeSlotsInRoomToLesson> freeSlotsInRoomToLesson = new List<FreeSlotsInRoomToLesson>();    //lista wolnych slotów sal pasujących do lekcji i grupy
             * foreach (TimeTable tt in roomTimeTables)
             * {
             *  if (tt.room.type.Equals(lesson.getSubject().getRoomType()) && tt.room.amount >= lesson.getGroup().amount)
             *  {
             *      freeSlotsInRoomToLesson.Add(new FreeSlotsInRoomToLesson(tt.getFreeTimeSlot(), tt.room));
             *  }
             * }
             *
             * List<TimeSlot> theSameSlots = getTheSameSlots(groupSlots, teacherSlots);                                       //generuje liste wolnych slotów dla grupt i nauczyciela i sprawdza wolne sale
             * freeSlotsToLesson.Add(new FreeSlotsToLesson(theSameSlots, lesson, freeSlotsInRoomToLesson));   //generuje lekcje wraz z listą wolnych slotów
             *
             *
             * if (getTheSameSlots(groupSlots,teacherSlots).Count == 0) {
             *  TimeTable firstTT = groupTT;
             *  TimeTable secondTT = teacherTT;
             *  isGroupHaveMoreSlots = true;
             *
             *  if (groupSlots.Count > teacherSlots.Count) {
             *      firstTT = teacherTT;
             *      secondTT = groupTT;
             *      isGroupHaveMoreSlots = false;
             *  }
             *
             *  //first - plan który posiada mniej wolnych slotów
             *  //second - plan który posiada więcej wolnych slotow
             *  //
             *  //w "second" szukamy lekcji mozliwych dozamiany w slotach  planu "first"
             *
             *
             *  List<TimeSlot> firstSlots = firstTT.getFreeTimeSlot(lesson.getSize());
             *  List<TimeSlot> secondSlots = secondTT.getFreeTimeSlot(lesson.getSize());
             *   // do poprawienia
             *   // dopisac uwzglednianie wiekszych lekcji
             *   // zwalnianie slotow przy zamianie
             *   // nie zmieniac wiekszych slotow
             *
             *  while (firstSlots.Count > 0) {
             *      int slotsIndex = rand.Next(0, firstSlots.Count);
             *      TimeSlot timeSlotToClear = firstSlots[slotsIndex];
             *      Lesson checkedLesson = secondTT.getDays()[timeSlotToClear.day].getSlots()[timeSlotToClear.hour].getLesson(0);
             *
             *      List<TimeSlot> slotsToCompare;
             *      if (isGroupHaveMoreSlots) {
             *          slotsToCompare = checkedLesson.getGroup().getTimeTable().getFreeTimeSlot();
             *      } else {
             *          slotsToCompare = checkedLesson.getTeacher().getTimeTable().getFreeTimeSlot();
             *      }
             *
             *      List<TimeSlot> freeSlots = getTheSameSlots(slotsToCompare, secondSlots);
             *      if (freeSlots.Count > 0 ) {
             *          int newSlotIndex = rand.Next(0, freeSlots.Count);
             *
             *          // wstawaimy lekcje do przeniesienia
             *          checkedLesson.getGroup().getTimeTable().addLesson(checkedLesson, freeSlots[newSlotIndex].day, freeSlots[newSlotIndex].hour);
             *          checkedLesson.getTeacher().getTimeTable().addLesson(checkedLesson, freeSlots[newSlotIndex].day, freeSlots[newSlotIndex].hour);
             *          // zwalniamy wolny slot
             *          checkedLesson.getGroup().getTimeTable().removeLesson(checkedLesson, timeSlotToClear.day, timeSlotToClear.hour);
             *          checkedLesson.getTeacher().getTimeTable().removeLesson(checkedLesson, timeSlotToClear.day, timeSlotToClear.hour);
             *          // ustawiam nowa lekcje
             *          lesson.getGroup().getTimeTable().addLesson(lesson, freeSlots[newSlotIndex].day, freeSlots[newSlotIndex].hour);
             *          lesson.getTeacher().getTimeTable().addLesson(lesson, freeSlots[newSlotIndex].day, freeSlots[newSlotIndex].hour);
             *          //Console.WriteLine("find free slots");
             *          break;
             *      }
             *
             *
             *      firstSlots.RemoveAt(slotsIndex);
             *  }
             *  if (firstSlots.Count == 0)
             *  {
             *      //Console.WriteLine("NOT FOUND");
             *
             *      // szukanie wgłąb
             *      firstSlots = firstTT.getFreeTimeSlot();
             *      while (firstSlots.Count > 0)
             *      {
             *          int slotsIndex = rand.Next(0, firstSlots.Count);
             *          TimeSlot timeSlotToClear = firstSlots[slotsIndex];
             *          Lesson checkedLesson = secondTT.getDays()[timeSlotToClear.day].getSlots()[timeSlotToClear.hour].getLesson(0);
             *
             *          if (removeLessonsAndFindNewPosition(checkedLesson))
             *          {
             *              removeLessonsAndFindNewPosition(lesson);
             *              break;
             *          }
             *
             *          firstSlots.RemoveAt(slotsIndex);
             *      }
             *
             *  }
             *
             * }
             *
             * return result;
             *
             */
        }