package fi.otavanopisto.pyramus.rest.controller;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
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.PhoneNumberDAO;
import fi.otavanopisto.pyramus.dao.users.StaffMemberDAO;
import fi.otavanopisto.pyramus.dao.users.UserDAO;
import fi.otavanopisto.pyramus.dao.users.UserVariableDAO;
import fi.otavanopisto.pyramus.dao.users.UserVariableKeyDAO;
import fi.otavanopisto.pyramus.domainmodel.base.Address;
import fi.otavanopisto.pyramus.domainmodel.base.ContactType;
import fi.otavanopisto.pyramus.domainmodel.base.Person;
import fi.otavanopisto.pyramus.domainmodel.base.PhoneNumber;
import fi.otavanopisto.pyramus.domainmodel.base.VariableType;
import fi.otavanopisto.pyramus.domainmodel.users.Role;
import fi.otavanopisto.pyramus.domainmodel.users.StaffMember;
import fi.otavanopisto.pyramus.domainmodel.users.User;
import fi.otavanopisto.pyramus.domainmodel.users.UserVariable;
import fi.otavanopisto.pyramus.domainmodel.users.UserVariableKey;
@Dependent
@Stateless
public class UserController {
@Inject
private UserDAO userDAO;
@Inject
private StaffMemberDAO staffMemberDAO;
@Inject
private UserVariableDAO userVariableDAO;
@Inject
private UserVariableKeyDAO userVariableKeyDAO;
@Inject
private AddressDAO addressDAO;
@Inject
private PhoneNumberDAO phoneNumberDAO;
/* Users */
public User findUserById(Long defaultUserId) {
return userDAO.findById(defaultUserId);
}
// TODO: StaffMemberController?
/* StaffMember */
public StaffMember createStaffMember(String firstName, String lastName, Role role, Person person) {
return staffMemberDAO.create(firstName, lastName, role, person, false);
}
public StaffMember findStaffMemberById(Long userId) {
return staffMemberDAO.findById(userId);
}
public StaffMember findStaffMemberByEmail(String email) {
return staffMemberDAO.findByUniqueEmail(email);
}
public List<StaffMember> listStaffMembers() {
return staffMemberDAO.listAll();
}
public List<StaffMember> listStaffMembers(Integer firstResult, Integer maxResults) {
return staffMemberDAO.listAll(firstResult, maxResults);
}
public List<StaffMember> listStaffMembersByPerson(Person person) {
return staffMemberDAO.listByPerson(person);
}
/* Variables */
public synchronized User updateUserVariables(User user, Map<String, String> variables) {
Set<String> newKeys = new HashSet<>(variables.keySet());
Set<String> oldKeys = new HashSet<>();
Set<String> updateKeys = new HashSet<>();
List<UserVariable> userVariables = userVariableDAO.listByUser(user);
for (UserVariable variable : userVariables) {
oldKeys.add(variable.getKey().getVariableKey());
}
for (String oldKey : oldKeys) {
if (!newKeys.contains(oldKey)) {
UserVariableKey key = findUserVariableKeyByVariableKey(oldKey);
UserVariable userVariable = findUserVariableByStudentAndKey(user, key);
deleteUserVariable(userVariable);
} else {
updateKeys.add(oldKey);
}
newKeys.remove(oldKey);
}
for (String newKey : newKeys) {
String value = variables.get(newKey);
UserVariableKey key = findUserVariableKeyByVariableKey(newKey);
createUserVariable(user, key, value);
}
for (String updateKey : updateKeys) {
String value = variables.get(updateKey);
UserVariableKey key = findUserVariableKeyByVariableKey(updateKey);
UserVariable userVariable = findUserVariableByStudentAndKey(user, key);
updateUserVariable(userVariable, value);
}
return user;
}
public UserVariable createUserVariable(User user, UserVariableKey key, String value) {
return userVariableDAO.create(user, key, value);
}
public UserVariable findUserVariableById(Long id) {
UserVariable userVariable = userVariableDAO.findById(id);
return userVariable;
}
public UserVariable findUserVariableByStudentAndKey(User user, UserVariableKey key) {
return userVariableDAO.findByUserAndVariableKey(user, key);
}
public void deleteUserVariable(UserVariable variable) {
userVariableDAO.delete(variable);
}
public UserVariable updateUserVariable(UserVariable userVariable, String value) {
return userVariableDAO.updateValue(userVariable, value);
}
public UserVariableKey findUserVariableKeyByVariableKey(String variableKey) {
return userVariableKeyDAO.findByVariableKey(variableKey);
}
public List<UserVariable> listUserVariablesByUser(User user) {
return userVariableDAO.listByUser(user);
}
/* Variable Keys */
public UserVariableKey createUserVariableKey(String key, String name, VariableType variableType, Boolean userEditable) {
return userVariableKeyDAO.create(key, name, variableType, userEditable);
}
public List<UserVariableKey> listUserVariableKeys() {
return userVariableKeyDAO.listAll();
}
public UserVariableKey updateUserVariableKey(UserVariableKey userVariableKey, String name, VariableType variableType, Boolean userEditable) {
userVariableKeyDAO.updateVariableName(userVariableKey, name);
userVariableKeyDAO.updateVariableType(userVariableKey, variableType);
userVariableKeyDAO.updateUserEditable(userVariableKey, userEditable);
return userVariableKey;
}
public void deleteUserVariableKey(UserVariableKey userVariableKey) {
userVariableKeyDAO.delete(userVariableKey);
}
/* Address */
public Address addStaffMemberAddress(StaffMember staffMember, ContactType contactType, Boolean defaultAddress, String name, String streetAddress, String postalCode, String city, String country) {
return addressDAO.create(staffMember.getContactInfo(), contactType, name ,streetAddress, postalCode, city, country, defaultAddress);
}
/* PhoneNumber */
public PhoneNumber addStaffMemberPhoneNumber(StaffMember staffMember, ContactType contactType, String number, Boolean defaultNumber) {
return phoneNumberDAO.create(staffMember.getContactInfo(), contactType, defaultNumber, number);
}
}