package fi.otavanopisto.pyramus.rest.controller;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.ejb.Stateless;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import fi.otavanopisto.pyramus.dao.base.TagDAO;
import fi.otavanopisto.pyramus.dao.courses.CourseDAO;
import fi.otavanopisto.pyramus.dao.modules.ModuleComponentDAO;
import fi.otavanopisto.pyramus.dao.modules.ModuleDAO;
import fi.otavanopisto.pyramus.dao.projects.ProjectModuleDAO;
import fi.otavanopisto.pyramus.domainmodel.base.Curriculum;
import fi.otavanopisto.pyramus.domainmodel.base.EducationalTimeUnit;
import fi.otavanopisto.pyramus.domainmodel.base.Subject;
import fi.otavanopisto.pyramus.domainmodel.base.Tag;
import fi.otavanopisto.pyramus.domainmodel.courses.Course;
import fi.otavanopisto.pyramus.domainmodel.modules.Module;
import fi.otavanopisto.pyramus.domainmodel.modules.ModuleComponent;
import fi.otavanopisto.pyramus.domainmodel.projects.Project;
import fi.otavanopisto.pyramus.domainmodel.users.User;
@Dependent
@Stateless
public class ModuleController {
@Inject
private ModuleDAO moduleDAO;
@Inject
private ModuleComponentDAO moduleComponentDAO;
@Inject
private ProjectModuleDAO projectModuleDAO;
@Inject
private TagDAO tagDAO;
@Inject
private CourseDAO courseDAO;
/* Module */
public Module createModule(String name, Subject subject, Integer courseNumber, Double moduleLength, EducationalTimeUnit moduleLengthTimeUnit,
String description, Long maxParticipantCount, User creator) {
Module module = moduleDAO.create(name, subject, courseNumber, moduleLength, moduleLengthTimeUnit, description, maxParticipantCount, creator);
return module;
}
public Module findModuleById(Long id) {
Module module = moduleDAO.findById(id);
return module;
}
public List<Module> listModules() {
List<Module> modules = moduleDAO.listAll();
return modules;
}
public List<Module> listUnarchivedModules() {
List<Module> modules = moduleDAO.listUnarchived();
return modules;
}
public Module updateModule(Module module, String name, Subject subject, Integer courseNumber, Double length, EducationalTimeUnit lengthTimeUnit,
String description, Long maxParticipantCount, User modifier) {
Module moduleUpdated = moduleDAO.update(module, name, subject, courseNumber, length, lengthTimeUnit, description, maxParticipantCount, modifier);
return moduleUpdated;
}
public Module archiveModule(Module module, User user) {
moduleDAO.archive(module, user);
return module;
}
public Module unarchiveModule(Module module, User user) {
moduleDAO.unarchive(module, user);
return module;
}
public void deleteModule(Module module) {
moduleDAO.delete(module);
}
/* Components */
public ModuleComponent createModuleComponent(Module module, Double length, EducationalTimeUnit lengthTimeUnit, String name, String description) {
return moduleComponentDAO.create(module, length, lengthTimeUnit, name, description);
}
public ModuleComponent findModuleComponentById(Long id) {
return moduleComponentDAO.findById(id);
}
public List<ModuleComponent> listModuleComponentsByModule(Module module) {
return moduleComponentDAO.listByModule(module);
}
public ModuleComponent updateModuleComponent(ModuleComponent moduleComponent, Double length, EducationalTimeUnit lengthTimeUnit, String name, String description) {
return moduleComponentDAO.update(moduleComponent, length, lengthTimeUnit, name, description);
}
public ModuleComponent archiveModuleComponent(ModuleComponent moduleComponent, User user) {
moduleComponentDAO.archive(moduleComponent, user);
return moduleComponent;
}
public void deleteModuleComponent(ModuleComponent moduleComponent) {
moduleComponentDAO.delete(moduleComponent);;
}
/* Tags */
public Tag createModuleTag(Module module, String text) {
Tag tag = tagDAO.findByText(text);
if(tag == null) {
tag = tagDAO.create(text);
}
module.addTag(tag);
return tag;
}
public synchronized Module updateModuleCurriculums(Module module, Set<Curriculum> curriculums) {
return moduleDAO.updateCurriculums(module, curriculums);
}
public Module updateModuleTags(Module module, List<String> tags) {
Set<String> newTags = new HashSet<>(tags);
Set<Tag> moduleTags = new HashSet<>(module.getTags());
for (Tag courseTag : moduleTags) {
if (!newTags.contains(courseTag.getText())) {
removeModuleTag(module, courseTag);
}
newTags.remove(courseTag.getText());
}
for (String newTag : newTags) {
createModuleTag(module, newTag);
}
return module;
}
public void removeModuleTag(Module module, Tag tag) {
module.removeTag(tag);
}
/* Courses */
public List<Course> listCoursesByModule(Module module) {
List<Course> courses = courseDAO.listByModule(module);
return courses;
}
/* Projects */
public List<Project> listProjectsByModule(Module module) {
return projectModuleDAO.listProjectsByModule(module);
}
}