package com.din.din.webapp.beans.interfaces;
import java.io.Serializable;
import java.util.Comparator;
import java.util.List;
import org.primefaces.model.DefaultScheduleModel;
import org.primefaces.model.ScheduleEvent;
import org.primefaces.model.ScheduleModel;
import com.din.din.model.dao.PlannedMenuDAO;
import com.din.din.model.dao.PlannedMenuEventDAO;
import com.din.din.model.entities.KeyEntity;
import com.din.din.model.entities.PlannedMenu;
import com.din.din.model.entities.PlannedMenuEvent;
import com.din.din.model.entities.Project;
import com.din.din.model.util.EntityCachingManager;
import com.din.din.model.util.EntityCachingManager.CacheLoader;
import com.din.din.webapp.beans.interfaces.wrappers.DinDinScheduleEvent;
public class EventManager implements Serializable {
private static final long serialVersionUID = -8232721248715079159L;
private ScheduleModel eventModel;
private Project project;
private PlannedMenu plannedMenu;
private EntityCachingManager cache;
//private TreeSet<PlannedMenuEvent> events;
public EventManager(Project project, EntityCachingManager cache) {
this.project = project;
this.cache = cache;
loadEventModel();
}
private void loadEventModel() {
if(eventModel == null) {
eventModel = new DefaultScheduleModel();
} else {
eventModel.clear();
}
//events = new TreeSet<PlannedMenuEvent>(new EventComparator());
if(plannedMenu == null) {
List<KeyEntity> plannedMenus;
try {
plannedMenus = cache.getChildren(PlannedMenu.class, "project", project, new CacheLoader<PlannedMenu>() {
public List<PlannedMenu> onCacheLoad() {
return PlannedMenuDAO.getPlannedMenuByProject(project);
}
});
plannedMenu = plannedMenus != null && plannedMenus.size() > 0 ? (PlannedMenu)plannedMenus.get(0) : null;
} catch (Exception e) {
e.printStackTrace();
}
}
if(plannedMenu != null) {
loadEvents();
}
}
private void loadEvents() {
try {
List<KeyEntity> plannedMenuEvents = cache.getChildren(PlannedMenuEvent.class, "plannedMenu", plannedMenu, new CacheLoader<PlannedMenuEvent>() {
public List<PlannedMenuEvent> onCacheLoad() {
return PlannedMenuEventDAO.getPlannedMenuEventsByPlannedMenu(plannedMenu);
}
});
for(KeyEntity keyEntity : plannedMenuEvents) {
PlannedMenuEvent event = (PlannedMenuEvent)keyEntity;
addEvent(event);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void addEvent(DinDinScheduleEvent scheduleEvent) {
if(scheduleEvent.getId() == null)
eventModel.addEvent(scheduleEvent);
else
eventModel.updateEvent(scheduleEvent);
}
public boolean isValid(DinDinScheduleEvent selected) {
boolean isValid = true;
for(ScheduleEvent event : eventModel.getEvents()) {
DinDinScheduleEvent dindinEvent = (DinDinScheduleEvent)event;
if(dindinEvent.getStartDate().equals(selected.getStartDate()) &&
dindinEvent.getMealType().equals(selected.getMealType()) &&
selected != dindinEvent) {
isValid = false;
break;
}
}
return isValid;
}
private void addEvent(PlannedMenuEvent event) {
DinDinScheduleEvent scheduleEvent = new DinDinScheduleEvent(event, project, cache);
addEvent(scheduleEvent);
}
public ScheduleModel getEventModel() {
return eventModel;
}
public void setEventModel(ScheduleModel eventModel) {
this.eventModel = eventModel;
}
protected class EventComparator implements Comparator<DinDinScheduleEvent> {
public int compare(DinDinScheduleEvent o1, DinDinScheduleEvent o2) {
int compareVal = o1.getStartDate().compareTo(o2.getStartDate());
if(compareVal == 0) {
int mealType2 = o2.getData().getMealType() != null ? o2.getData().getMealType().ordinal() : -1;
int mealType1 = o1.getData().getMealType() != null ? o1.getData().getMealType().ordinal() : -1;
compareVal = mealType2 - mealType1;
}
return compareVal;
}
}
}