/**
* Copyright © 2002 Instituto Superior Técnico
*
* This file is part of FenixEdu Academic.
*
* FenixEdu Academic is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FenixEdu Academic is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>.
*/
package org.fenixedu.academic.dto;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Comparator;
import java.util.List;
import org.fenixedu.academic.domain.FrequencyType;
import org.fenixedu.academic.domain.Lesson;
import org.fenixedu.academic.domain.SchoolClass;
import org.fenixedu.academic.domain.Shift;
import org.fenixedu.academic.domain.ShiftType;
import org.fenixedu.academic.util.DiaSemana;
import org.joda.time.YearMonthDay;
import pt.ist.fenixframework.FenixFramework;
import com.google.common.base.Strings;
public class InfoLesson extends InfoShowOccupation implements Comparable<InfoLesson> {
private final static Comparator<InfoLesson> INFO_LESSON_COMPARATOR_CHAIN = new Comparator<InfoLesson>() {
@Override
public int compare(InfoLesson o1, InfoLesson o2) {
final int c1 = o1.getDiaSemana().getDiaSemana().compareTo(o2.getDiaSemana().getDiaSemana());
if (c1 != 0) {
return c1;
}
final int c2 = o1.getInicio().compareTo(o2.getInicio());
if (c2 != 0) {
return c2;
}
final int c3 = o1.getFim().compareTo(o2.getFim());
return c3 != 0 ? o1.getInfoSala().getNome().compareTo(o2.getInfoShift().getNome()) : c3;
}
};
private InfoRoom infoSala;
private InfoShift infoShift;
private InfoRoomOccupation infoRoomOccupation;
public InfoLesson(Lesson lesson) {
super.copyFromDomain(lesson);
}
@Override
public ShiftType getTipo() {
return null;
}
@Override
public DiaSemana getDiaSemana() {
return getLesson().getDiaSemana();
}
@Override
public Calendar getFim() {
return getLesson().getFim();
}
@Override
public Calendar getInicio() {
return getLesson().getInicio();
}
public FrequencyType getFrequency() {
return getLesson().getFrequency();
}
public YearMonthDay getLessonBegin() {
return getLesson() != null && getLesson().getPeriod() != null ? getLesson().getPeriod().getStartYearMonthDay() : null;
}
public YearMonthDay getLessonEnd() {
return getLesson() != null && getLesson().getPeriod() != null ? getLesson().getPeriod()
.getLastOccupationPeriodOfNestedPeriods().getEndYearMonthDay() : null;
}
public String getWeekDay() {
final String result = getDiaSemana().getDiaSemana().toString();
if (result != null && result.equals("7")) {
return "S";
}
if (result != null && result.equals("1")) {
return "D";
}
return result;
}
public String getLessonDuration() {
return getLesson().getUnitHours().toString();
}
public InfoRoom getInfoSala() {
return (infoSala == null) ? infoSala = InfoRoom.newInfoFromDomain(getLesson().getSala()) : infoSala;
}
@Override
public InfoShift getInfoShift() {
return (infoShift == null) ? infoShift = InfoShift.newInfoFromDomain(getLesson().getShift()) : infoShift;
}
@Override
public InfoRoomOccupation getInfoRoomOccupation() {
if (infoRoomOccupation == null) {
infoRoomOccupation = InfoRoomOccupation.newInfoFromDomain(getLesson().getLessonSpaceOccupation());
}
return infoRoomOccupation;
}
public static InfoLesson newInfoFromDomain(Lesson lesson) {
return (lesson != null) ? new InfoLesson(lesson) : null;
}
/*
* This is a convenience method, until RenderTimeTableTag support proper domain classes...
*/
@Deprecated
public static List<InfoLesson> newInfosForSchoolClass(SchoolClass schoolClass) {
List<InfoLesson> lessons = new ArrayList<>();
for (Shift shift : schoolClass.getAssociatedShiftsSet()) {
for (Lesson lesson : shift.getAssociatedLessonsSet()) {
lessons.add(new InfoLesson(lesson));
}
}
return lessons;
}
@Override
public int compareTo(InfoLesson arg0) {
return INFO_LESSON_COMPARATOR_CHAIN.compare(this, arg0);
}
public String getNextPossibleLessonInstanceDate() {
YearMonthDay day = getLesson().getNextPossibleLessonInstanceDate();
return day != null ? day.toString("dd/MM/yyyy") : "-";
}
@Override
public boolean equals(Object obj) {
boolean resultado = false;
if (obj instanceof InfoLesson) {
InfoLesson infoAula = (InfoLesson) obj;
resultado =
(getDiaSemana().equals(infoAula.getDiaSemana()))
&& (getInicio().get(Calendar.HOUR_OF_DAY) == infoAula.getInicio().get(Calendar.HOUR_OF_DAY))
&& (getInicio().get(Calendar.MINUTE) == infoAula.getInicio().get(Calendar.MINUTE))
&& (getFim().get(Calendar.HOUR_OF_DAY) == infoAula.getFim().get(Calendar.HOUR_OF_DAY))
&& (getFim().get(Calendar.MINUTE) == infoAula.getFim().get(Calendar.MINUTE))
&& ((getInfoSala() == null && infoAula.getInfoSala() == null) || (getInfoSala() != null && getInfoSala()
.equals(infoAula.getInfoSala())))
&& ((getInfoRoomOccupation() == null && infoAula.getInfoRoomOccupation() == null) || (getInfoRoomOccupation() != null && getInfoRoomOccupation()
.equals(infoAula.getInfoRoomOccupation())));
}
return resultado;
}
public Lesson getLesson() {
if (!Strings.isNullOrEmpty(getExternalId())) {
Lesson lesson = FenixFramework.getDomainObject(getExternalId());
if (FenixFramework.isDomainObjectValid(lesson)) {
return lesson;
}
}
return null;
}
public String getOccurrenceWeeksAsString() {
return getLesson().getOccurrenceWeeksAsString();
}
}