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.projects.ProjectDAO;
import fi.otavanopisto.pyramus.dao.projects.ProjectModuleDAO;
import fi.otavanopisto.pyramus.domainmodel.base.EducationalTimeUnit;
import fi.otavanopisto.pyramus.domainmodel.base.Tag;
import fi.otavanopisto.pyramus.domainmodel.modules.Module;
import fi.otavanopisto.pyramus.domainmodel.projects.Project;
import fi.otavanopisto.pyramus.domainmodel.projects.ProjectModule;
import fi.otavanopisto.pyramus.domainmodel.projects.ProjectModuleOptionality;
import fi.otavanopisto.pyramus.domainmodel.users.User;
import fi.otavanopisto.pyramus.persistence.search.SearchResult;
@Dependent
@Stateless
public class ProjectController {
@Inject
private ProjectDAO projectDAO;
@Inject
private TagDAO tagDAO;
@Inject
private ProjectModuleDAO projectModuleDAO;
/* Projects */
public Project createProject(String name, String description, double optionalStudiesLength, EducationalTimeUnit optionalStudiesLengthTimeUnit, User user) {
Project project = projectDAO.create(name, description, optionalStudiesLength, optionalStudiesLengthTimeUnit, user);
return project;
}
public List<Project> listProjects() {
List<Project> projects = projectDAO.listAll();
return projects;
}
public List<Project> listUnarchivedProjects() {
List<Project> projects = projectDAO.listUnarchived();
return projects;
}
public Project findProjectById(Long id) {
Project project = projectDAO.findById(id);
return project;
}
public Project updateProject(Project project, String name, String description, double optionalStudiesLength,
EducationalTimeUnit optionalStudiesLengthTimeUnit, User user) {
Project updatedProject = projectDAO.update(project, name, description, optionalStudiesLength, optionalStudiesLengthTimeUnit, user);
return updatedProject;
}
public Project archiveProject(Project project, User user) {
projectDAO.archive(project, user);
return project;
}
public Project unarchiveProject(Project project, User user) {
projectDAO.unarchive(project, user);
return project;
}
public void deleteProject(Project project) {
projectDAO.delete(project);
}
public SearchResult<Project> searchProjects(int resultsPerPage, int page,String name, String description, String tags, boolean filterArchived) {
SearchResult<Project> projects = projectDAO.searchProjects(resultsPerPage, page, name, description, tags, filterArchived);
return projects;
}
/* ProjectModule */
public ProjectModule createProjectModule(Project project, Module module, ProjectModuleOptionality optionality) {
ProjectModule projectModule = projectModuleDAO.create(project, module, optionality);
return projectModule;
}
public List<ProjectModule> listProjectModules(Project project) {
List<ProjectModule> modules = projectModuleDAO.listByProject(project);
return modules;
}
public ProjectModule findProjectModuleById(Long id) {
ProjectModule projectModule = projectModuleDAO.findById(id);
return projectModule;
}
public ProjectModule updateProjectModule(ProjectModule projectModule, ProjectModuleOptionality optionality) {
projectModuleDAO.update(projectModule, optionality);
return projectModule;
}
public void deleteProjectModule(ProjectModule projectModule) {
projectModuleDAO.delete(projectModule);
}
/* Tags */
public Tag createProjectTag(Project project, String text) {
Tag tag = tagDAO.findByText(text);
if (tag == null) {
tag = tagDAO.create(text);
}
project.addTag(tag);
return tag;
}
public Project removeProjectTag(Project project, Tag tag) {
return projectDAO.removeTag(project, tag);
}
public Project updateProjectTags(Project project, List<String> tags) {
Set<String> newTags = new HashSet<>(tags);
Set<Tag> projectTags = new HashSet<>(project.getTags());
for (Tag projectTag : projectTags) {
if (!newTags.contains(projectTag.getText())) {
removeProjectTag(project, projectTag);
}
newTags.remove(projectTag.getText());
}
for (String newTag : newTags) {
createProjectTag(project, newTag);
}
return project;
}
}