package fi.otavanopisto.pyramus.rest.controller;
import java.util.List;
import javax.ejb.Stateless;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import fi.otavanopisto.pyramus.dao.base.AddressDAO;
import fi.otavanopisto.pyramus.dao.base.BillingDetailsDAO;
import fi.otavanopisto.pyramus.dao.base.ContactTypeDAO;
import fi.otavanopisto.pyramus.dao.base.ContactURLDAO;
import fi.otavanopisto.pyramus.dao.base.ContactURLTypeDAO;
import fi.otavanopisto.pyramus.dao.base.CourseBaseVariableKeyDAO;
import fi.otavanopisto.pyramus.dao.base.EducationSubtypeDAO;
import fi.otavanopisto.pyramus.dao.base.EducationTypeDAO;
import fi.otavanopisto.pyramus.dao.base.EducationalTimeUnitDAO;
import fi.otavanopisto.pyramus.dao.base.EmailDAO;
import fi.otavanopisto.pyramus.dao.base.PhoneNumberDAO;
import fi.otavanopisto.pyramus.dao.base.SubjectDAO;
import fi.otavanopisto.pyramus.dao.grading.GradeDAO;
import fi.otavanopisto.pyramus.dao.grading.GradingScaleDAO;
import fi.otavanopisto.pyramus.domainmodel.base.Address;
import fi.otavanopisto.pyramus.domainmodel.base.BillingDetails;
import fi.otavanopisto.pyramus.domainmodel.base.ContactInfo;
import fi.otavanopisto.pyramus.domainmodel.base.ContactType;
import fi.otavanopisto.pyramus.domainmodel.base.ContactURL;
import fi.otavanopisto.pyramus.domainmodel.base.ContactURLType;
import fi.otavanopisto.pyramus.domainmodel.base.CourseBaseVariableKey;
import fi.otavanopisto.pyramus.domainmodel.base.EducationSubtype;
import fi.otavanopisto.pyramus.domainmodel.base.EducationType;
import fi.otavanopisto.pyramus.domainmodel.base.EducationalTimeUnit;
import fi.otavanopisto.pyramus.domainmodel.base.Email;
import fi.otavanopisto.pyramus.domainmodel.base.PhoneNumber;
import fi.otavanopisto.pyramus.domainmodel.base.Subject;
import fi.otavanopisto.pyramus.domainmodel.base.VariableType;
import fi.otavanopisto.pyramus.domainmodel.grading.Grade;
import fi.otavanopisto.pyramus.domainmodel.grading.GradingScale;
import fi.otavanopisto.pyramus.domainmodel.users.User;
import fi.otavanopisto.pyramus.framework.UserUtils;
import fi.otavanopisto.pyramus.persistence.search.SearchResult;
@Dependent
@Stateless
public class CommonController {
@Inject
private EducationTypeDAO educationTypeDAO;
@Inject
private EducationSubtypeDAO educationSubtypeDAO;
@Inject
private SubjectDAO subjectDAO;
@Inject
private GradingScaleDAO gradingScaleDAO;
@Inject
private GradeDAO gradeDAO;
@Inject
private EducationalTimeUnitDAO educationalTimeUnitDAO;
@Inject
private CourseBaseVariableKeyDAO courseBaseVariableKeyDAO;
@Inject
private EmailDAO emailDAO;
@Inject
private AddressDAO addressDAO;
@Inject
private PhoneNumberDAO phoneNumberDAO;
@Inject
private ContactURLTypeDAO contactURLTypeDAO;
@Inject
private ContactURLDAO contactURLDAO;
@Inject
private ContactTypeDAO contactTypeDAO;
@Inject
private BillingDetailsDAO billingDetailsDAO;
/* EducationType */
public EducationType createEducationType(String name, String code) {
EducationType educationType = educationTypeDAO.create(name, code);
return educationType;
}
public List<EducationType> listEducationTypes() {
List<EducationType> educationTypes = educationTypeDAO.listAll();
return educationTypes;
}
public List<EducationType> listUnarchivedEducationTypes() {
List<EducationType> educationTypes = educationTypeDAO.listUnarchived();
return educationTypes;
}
public EducationType findEducationTypeById(Long id) {
EducationType educationType = educationTypeDAO.findById(id);
return educationType;
}
public EducationType updateEducationType(EducationType educationType, String name, String code) {
educationTypeDAO.update(educationType, name, code);
return educationType;
}
public EducationType archiveEducationType(EducationType educationType, User user) {
educationTypeDAO.archive(educationType, user);
return educationType;
}
public EducationType unarchiveEducationType(EducationType educationType, User user) {
educationTypeDAO.unarchive(educationType, user);
return educationType;
}
public void deleteEducationType(EducationType educationType) {
educationTypeDAO.delete(educationType);
}
/* EducationSubtype */
public EducationSubtype createEducationSubtype(EducationType educationType, String name, String code) {
return educationSubtypeDAO.create(educationType, name, code);
}
public EducationSubtype findEducationSubtypeById(Long id) {
return educationSubtypeDAO.findById(id);
}
public List<EducationSubtype> listEducationSubtypesByEducationType(EducationType educationType) {
return educationSubtypeDAO.listByEducationType(educationType);
}
public EducationSubtype updateEducationSubtype(EducationSubtype educationSubtype, EducationType educationType, String name, String code) {
educationSubtype = educationSubtypeDAO.update(educationSubtype, name, code);
if (!educationType.getId().equals(educationSubtype.getEducationType().getId())) {
educationSubtype = educationSubtypeDAO.updateEducationType(educationSubtype, educationType);
}
return educationSubtype;
}
public EducationSubtype archiveEducationSubtype(EducationSubtype educationSubtype, User user) {
educationSubtypeDAO.archive(educationSubtype, user);
return educationSubtype;
}
public void deleteEducationSubtype(EducationSubtype educationSubtype) {
educationSubtypeDAO.delete(educationSubtype);
}
/* GradingScale */
public GradingScale createGradingScale(String name, String description) {
GradingScale gradingScale = gradingScaleDAO.create(name, description);
return gradingScale;
}
public List<GradingScale> listGradingScales() {
List<GradingScale> gradingScales = gradingScaleDAO.listAll();
return gradingScales;
}
public List<GradingScale> listUnarchivedGradingScales() {
List<GradingScale> gradingScales = gradingScaleDAO.listUnarchived();
return gradingScales;
}
public GradingScale findGradingScaleById(Long id) {
GradingScale gradingScale = gradingScaleDAO.findById(id);
return gradingScale;
}
public GradingScale archiveGradingScale(GradingScale gradingScale, User user) {
gradingScaleDAO.archive(gradingScale, user);
return gradingScale;
}
public GradingScale unarchiveGradingScale(GradingScale gradingScale, User user) {
gradingScaleDAO.unarchive(gradingScale, user);
return gradingScale;
}
public void deleteGradingScale(GradingScale gradingScale) {
gradingScaleDAO.delete(gradingScale);
}
/* Grade */
public Grade createGrade(GradingScale gradingScale, String name, String description, Boolean passingGrade, Double gpa, String qualification) {
Grade grade = gradeDAO.create(gradingScale, name, description, passingGrade, gpa, qualification);
return grade;
}
public Grade findGradeByIdId(Long id) {
return gradeDAO.findById(id);
}
public Grade updateGrade(Grade grade, String name, String description, Boolean passingGrade, Double gpa, String qualification) {
return gradeDAO.update(grade, name, description, passingGrade, gpa, qualification);
}
public Grade archiveGrade(Grade grade, User user) {
gradeDAO.archive(grade, user);
return grade;
}
public Grade unarchiveGrade(Grade grade, User user) {
gradeDAO.unarchive(grade, user);
return grade;
}
public void deleteGrade(Grade grade) {
gradeDAO.delete(grade);
}
/* EducationalTimeUnit */
public EducationalTimeUnit createEducationalTimeUnit(Double baseUnits, String name, String symbol) {
EducationalTimeUnit educationalTimeUnit = educationalTimeUnitDAO.create(baseUnits, name, symbol);
return educationalTimeUnit;
}
public EducationalTimeUnit findEducationalTimeUnitById(Long id) {
EducationalTimeUnit educationalTimeUnit = educationalTimeUnitDAO.findById(id);
return educationalTimeUnit;
}
public List<EducationalTimeUnit> listEducationalTimeUnits() {
List<EducationalTimeUnit> educationalTimeUnits = educationalTimeUnitDAO.listAll();
return educationalTimeUnits;
}
public List<EducationalTimeUnit> listUnarchivedEducationalTimeUnits() {
List<EducationalTimeUnit> educationalTimeUnits = educationalTimeUnitDAO.listUnarchived();
return educationalTimeUnits;
}
public EducationalTimeUnit updateEducationalTimeUnit(EducationalTimeUnit educationalTimeUnit, Double baseUnits, String name, String symbol) {
educationalTimeUnitDAO.update(educationalTimeUnit, baseUnits, name, symbol);
return educationalTimeUnit;
}
public EducationalTimeUnit archiveEducationalTimeUnit(EducationalTimeUnit educationalTimeUnit, User user) {
educationalTimeUnitDAO.archive(educationalTimeUnit, user);
return educationalTimeUnit;
}
public EducationalTimeUnit unarchiveEducationalTimeUnit(EducationalTimeUnit educationalTimeUnit, User user) {
educationalTimeUnitDAO.unarchive(educationalTimeUnit, user);
return educationalTimeUnit;
}
public void deleteEducationalTimeUnit(EducationalTimeUnit educationalTimeUnit) {
educationalTimeUnitDAO.delete(educationalTimeUnit);
}
public Subject createSubject(String code, String name, EducationType educationType) {
Subject subject = subjectDAO.create(code, name, educationType);
return subject;
}
public List<Subject> listSubjects() {
List<Subject> subjects = subjectDAO.listAll();
return subjects;
}
public List<Subject> listUnarchivedSubjects() {
List<Subject> subjects = subjectDAO.listUnarchived();
return subjects;
}
public List<Subject> listSubjectsByEducationType(EducationType educationType) {
List<Subject> subjects = subjectDAO.listByEducationType(educationType);
return subjects;
}
public Subject findSubjectById(Long id) {
Subject subject = subjectDAO.findById(id);
return subject;
}
public SearchResult<Subject> searchSubjects(int resultsPerPage, int page, String text) {
SearchResult<Subject> subjects = subjectDAO.searchSubjectsBasic(resultsPerPage, page, text);
return subjects;
}
public Subject updateSubject(Subject subject, String code, String name, EducationType educationType) {
subjectDAO.update(subject, code, name, educationType);
return subject;
}
public GradingScale updateGradingScale(GradingScale gradingScale, String name, String description) {
gradingScaleDAO.update(gradingScale, name, description);
return gradingScale;
}
public Subject archiveSubject(Subject subject, User user) {
subjectDAO.archive(subject, user);
return subject;
}
public Subject unarchiveSubject(Subject subject, User user) {
subjectDAO.unarchive(subject, user);
return subject;
}
public void deleteSubject(Subject subject) {
subjectDAO.delete(subject);
}
/* CourseBaseVariableKey */
public CourseBaseVariableKey createCourseBaseVariableKey(String key, String name, VariableType variableType, Boolean userEditable) {
return courseBaseVariableKeyDAO.create(key, name, variableType, userEditable);
}
public CourseBaseVariableKey findCourseBaseVariableKeyByVariableKey(String variableKey) {
return courseBaseVariableKeyDAO.findByVariableKey(variableKey);
}
public List<CourseBaseVariableKey> listCourseBaseVariableKeys() {
return courseBaseVariableKeyDAO.listAll();
}
public CourseBaseVariableKey updateCourseBaseVariableKey(CourseBaseVariableKey courseBaseVariableKey, String variableName, VariableType variableType, Boolean userEditable) {
return
courseBaseVariableKeyDAO.updateUserEditable(
courseBaseVariableKeyDAO.updateVariableName(
courseBaseVariableKeyDAO.updateVariableType(courseBaseVariableKey, variableType), variableName), userEditable);
}
public void deleteCourseBaseVariableKey(CourseBaseVariableKey courseBaseVariableKey) {
courseBaseVariableKeyDAO.delete(courseBaseVariableKey);
}
/* Email */
// TODO: allowed email check is better handled when email is created through staffmember or student, maybe it should be always context-aware creation
public Email createEmail(ContactInfo contactInfo, ContactType contactType, Boolean defaultAddress, String address) {
// Trim the email address
address = address != null ? address.trim() : null;
if (!UserUtils.isAllowedEmail(address, contactType))
throw new RuntimeException("Email address is in use.");
return emailDAO.create(contactInfo, contactType, defaultAddress, address);
}
public Email findDefaultEmailByContactInfo(ContactInfo contactInfo) {
return emailDAO.findByContactInfoAndDefaultAddress(contactInfo, Boolean.TRUE);
}
public Email findEmailById(Long id) {
return emailDAO.findById(id);
}
public void deleteEmail(Email email) {
emailDAO.delete(email);
}
/* ContactType */
public ContactType createContactType(String name, Boolean nonUnique) {
return contactTypeDAO.create(name, nonUnique);
}
public ContactType findContactTypeById(Long contactTypeId) {
return contactTypeDAO.findById(contactTypeId);
}
public ContactType updateContactType(ContactType contactType, String name, Boolean nonUnique) {
return contactTypeDAO.update(contactType, name, nonUnique);
}
public void archiveContactType(ContactType contactType, User user) {
contactTypeDAO.archive(contactType, user);
}
public List<ContactType> listUnarchivedContactTypes() {
return contactTypeDAO.listUnarchived();
}
public List<ContactType> listContactTypes() {
return contactTypeDAO.listAll();
}
public void deleteContactType(ContactType contactType) {
contactTypeDAO.delete(contactType);
}
/* Address */
public Address createAddress(ContactInfo contactInfo, ContactType contactType, String name, String streetAddress, String postalCode, String city, String country, Boolean defaultAddress) {
return addressDAO.create(contactInfo, contactType, name, streetAddress, postalCode, city, country, defaultAddress);
}
public Address findAddressById(Long id) {
return addressDAO.findById(id);
}
public void deleteAddress(Address address) {
addressDAO.delete(address);
}
/* PhoneNumber */
public PhoneNumber createPhoneNumber(ContactInfo contactInfo, ContactType contactType, Boolean defaultNumber, String number) {
return phoneNumberDAO.create(contactInfo, contactType, defaultNumber, number);
}
public PhoneNumber findPhoneNumberById(Long id) {
return phoneNumberDAO.findById(id);
}
public void deletePhoneNumber(PhoneNumber phoneNumber) {
phoneNumberDAO.delete(phoneNumber);
}
/* ContactURLType */
public ContactURLType createContactURLType(String name) {
return contactURLTypeDAO.create(name);
}
public ContactURLType findContactURLTypeById(Long contactURLTypeId) {
return contactURLTypeDAO.findById(contactURLTypeId);
}
public ContactURLType updateContactURLType(ContactURLType contactURLType, String name) {
return contactURLTypeDAO.update(contactURLType, name);
}
public void archiveContactURLType(ContactURLType contactURLType, User user) {
contactURLTypeDAO.archive(contactURLType, user);
}
public List<ContactURLType> listUnarchivedContactURLTypes() {
return contactURLTypeDAO.listUnarchived();
}
public List<ContactURLType> listContactURLTypes() {
return contactURLTypeDAO.listAll();
}
public void deleteContactURLType(ContactURLType contactURLType) {
contactURLTypeDAO.delete(contactURLType);
}
/* ContactURL */
public ContactURL findContactURLById(Long id) {
return contactURLDAO.findById(id);
}
public void deleteContactURL(ContactURL contactURL) {
contactURLDAO.delete(contactURL);
}
/* BillingDetails */
public BillingDetails findBillingDetailsById(Long billingDetailsId) {
return billingDetailsDAO.findById(billingDetailsId);
}
}