/**
* 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.spaceManager;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import org.fenixedu.academic.domain.space.SpaceUtils;
import org.fenixedu.academic.domain.space.WrittenEvaluationSpaceOccupation;
import org.fenixedu.academic.domain.time.calendarStructure.AcademicInterval;
import org.fenixedu.academic.dto.LinkObject;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.spaces.domain.Space;
import org.fenixedu.spaces.domain.occupation.Occupation;
import org.fenixedu.spaces.domain.occupation.SharedOccupation;
public class FindSpacesBean implements Serializable {
private String labelToSearch;
private Space buildingReference;
private Space campusReference;
private List<LinkObject> spacePath;
private Space selectedSpaceReference;
private Boolean extraOptions;
private Boolean withSchedule;
private Boolean withWrittenEvaluations;
private SpacesSearchCriteriaType searchType;
private AcademicInterval academicInterval;
public FindSpacesBean() {
setExtraOptions(false);
setSearchType(SpacesSearchCriteriaType.SPACE);
}
public FindSpacesBean(Space space, AcademicInterval academicInterval) {
this();
setSpace(space);
setAcademicInterval(academicInterval);
}
public FindSpacesBean(Space space, SpacesSearchCriteriaType criteriaType, AcademicInterval academicInterval) {
setSpace(space);
setExtraOptions(false);
setSearchType(criteriaType);
setAcademicInterval(academicInterval);
}
public List<LinkObject> getSuroundingSpacePath() {
Space space = getSpace();
return space != null ? getPath(space.getParent()) : getPath(null);
}
public List<LinkObject> getSpacePath() {
return getPath(getSpace());
}
private List<LinkObject> getPath(Space space) {
List<LinkObject> result = new ArrayList<LinkObject>();
if (space != null) {
List<Space> spaceFullPath = SpaceUtils.getSpaceFullPath(space);
for (Space surroundingSpace : spaceFullPath) {
result.add(new LinkObject(surroundingSpace.getExternalId(), "viewSpace", surroundingSpace.getName()));
}
}
return result;
}
public static enum SpacesSearchCriteriaType {
SPACE, PERSON, EXECUTION_COURSE, WRITTEN_EVALUATION;
public String getName() {
return name();
}
}
public void setSpacePath(List<LinkObject> spacePath) {
this.spacePath = spacePath;
}
public void setSpace(Space space) {
this.selectedSpaceReference = space;
}
public Space getSpace() {
return this.selectedSpaceReference;
}
public void setAcademicInterval(AcademicInterval academicInterval) {
this.academicInterval = academicInterval;
}
public AcademicInterval getAcademicInterval() {
return academicInterval;
}
public void setBuilding(Space building) {
this.buildingReference = building;
}
public Space getBuilding() {
return this.buildingReference;
}
public void setCampus(Space floor) {
this.campusReference = floor;
}
public Space getCampus() {
return this.campusReference;
}
public String getLabelToSearch() {
return labelToSearch;
}
public void setLabelToSearch(String labelToSearch) {
this.labelToSearch = labelToSearch;
}
public Boolean getExtraOptions() {
return extraOptions;
}
public void setExtraOptions(Boolean extraOptions) {
this.extraOptions = extraOptions;
}
public Boolean getWithSchedule() {
Space space = getSpace();
if (space != null && (SpaceUtils.isRoom(space) || SpaceUtils.isRoomSubdivision(space))) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
public void setWithSchedule(Boolean withSchedule) {
this.withSchedule = withSchedule;
}
public SpacesSearchCriteriaType getSearchType() {
return searchType;
}
public void setSearchType(SpacesSearchCriteriaType searchType) {
this.searchType = searchType;
}
public Boolean getWithWrittenEvaluations() {
return searchType != null && searchType.equals(SpacesSearchCriteriaType.WRITTEN_EVALUATION);
}
public void setWithWrittenEvaluations(Boolean withWrittenEvaluations) {
this.withWrittenEvaluations = withWrittenEvaluations;
}
public Boolean getIsOccupiedByWrittenEvaluations() {
for (Occupation occupation : getSpace().getOccupationSet()) {
if (occupation instanceof WrittenEvaluationSpaceOccupation) {
return true;
}
}
return false;
}
public Integer getExamCapacity() {
Optional<Integer> metadata = getSpace().getMetadata("examCapacity");
return metadata.isPresent() ? metadata.get() : 0;
}
public List<User> getOccupants() {
return getSpace().getOccupationSet().stream().filter(occ -> occ instanceof SharedOccupation && occ.isActive())
.map(occ -> (SharedOccupation) occ).map(so -> so.getUser()).distinct().collect(Collectors.toList());
}
}