package fi.otavanopisto.muikku.plugins.schooldatapyramus;
import java.util.List;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import fi.otavanopisto.muikku.model.users.UserGroupEntity;
import fi.otavanopisto.muikku.model.users.UserGroupUserEntity;
import fi.otavanopisto.muikku.model.users.UserSchoolDataIdentifier;
import fi.otavanopisto.muikku.plugins.schooldatapyramus.PyramusIdentifierMapper.StudentGroupType;
import fi.otavanopisto.muikku.plugins.schooldatapyramus.rest.PyramusClient;
import fi.otavanopisto.muikku.schooldata.SchoolDataIdentifier;
import fi.otavanopisto.muikku.schooldata.events.SchoolDataUserGroupUserDiscoveredEvent;
import fi.otavanopisto.muikku.schooldata.events.SchoolDataUserGroupUserRemovedEvent;
import fi.otavanopisto.muikku.schooldata.events.SchoolDataUserGroupUserUpdatedEvent;
import fi.otavanopisto.muikku.schooldata.events.SchoolDataUserUpdatedEvent;
import fi.otavanopisto.muikku.users.UserGroupEntityController;
import fi.otavanopisto.muikku.users.UserSchoolDataIdentifierController;
import fi.otavanopisto.pyramus.rest.model.Student;
@ApplicationScoped
public class PyramusSchoolDataUserListener {
@Inject
private UserGroupEntityController userGroupEntityController;
@Inject
private Instance<PyramusClient> pyramusClient;
@Inject
private PyramusIdentifierMapper identifierMapper;
@Inject
private UserSchoolDataIdentifierController userSchoolDataIdentifierController;
@Inject
private Event<SchoolDataUserGroupUserDiscoveredEvent> schoolDataUserGroupUserDiscoveredEvent;
@Inject
private Event<SchoolDataUserGroupUserUpdatedEvent> schoolDataUserGroupUserUpdatedEvent;
@Inject
private Event<SchoolDataUserGroupUserRemovedEvent> schoolDataUserGroupUserRemovedEvent;
public void onSchoolDataUserUpdatedEvent(@Observes SchoolDataUserUpdatedEvent event) {
for (SchoolDataIdentifier identifier : event.getDiscoveredIdentifiers()) {
if (identifier.getDataSource().equals(SchoolDataPyramusPluginDescriptor.SCHOOL_DATA_SOURCE)) {
handlePyramusUserDiscovered(identifier);
}
}
for (SchoolDataIdentifier identifier : event.getUpdatedIdentifiers()) {
if (identifier.getDataSource().equals(SchoolDataPyramusPluginDescriptor.SCHOOL_DATA_SOURCE)) {
handlePyramusUserUpdated(identifier);
}
}
for (SchoolDataIdentifier identifier : event.getRemovedIdentifiers()) {
if (identifier.getDataSource().equals(SchoolDataPyramusPluginDescriptor.SCHOOL_DATA_SOURCE)) {
handlePyramusUserRemoved(identifier);
}
}
}
private void handlePyramusUserDiscovered(SchoolDataIdentifier identifier) {
Long pyramusStudentId = identifierMapper.getPyramusStudentId(identifier.getIdentifier());
if (pyramusStudentId != null) {
Student student = pyramusClient.get().get(String.format("/students/students/%d", pyramusStudentId), Student.class);
if (student != null) {
Long pyramusStudyProgrammeId = student.getStudyProgrammeId();
if (pyramusStudyProgrammeId != null) {
boolean isActive = (!student.getArchived()) && (student.getStudyEndDate() == null);
if (isActive) {
String userGroupUserIdentifier = identifierMapper.getStudyProgrammeStudentIdentifier(pyramusStudentId);
String userGroupIdentifier = identifierMapper.getStudyProgrammeIdentifier(pyramusStudyProgrammeId);
String userEntityIdentifier = identifier.getIdentifier();
fireUserGroupUserDiscovered(userGroupUserIdentifier, userGroupIdentifier, userEntityIdentifier);
}
}
}
}
}
private void handlePyramusUserUpdated(SchoolDataIdentifier identifier) {
Long pyramusStudentId = identifierMapper.getPyramusStudentId(identifier.getIdentifier());
if (pyramusStudentId != null) {
Student student = pyramusClient.get().get(String.format("/students/students/%d", pyramusStudentId), Student.class);
if (student != null) {
Long pyramusStudyProgrammeId = student.getStudyProgrammeId();
if (pyramusStudyProgrammeId != null) {
String userGroupIdentifier = identifierMapper.getStudyProgrammeIdentifier(pyramusStudyProgrammeId);
boolean found = false;
boolean isActive = !student.getArchived() && student.getStudyEndDate() == null;
// Remove StudyProgrammeGroups
UserSchoolDataIdentifier userSchoolDataIdentifier = userSchoolDataIdentifierController.findUserSchoolDataIdentifierByDataSourceAndIdentifier(
identifier.getDataSource(), identifier.getIdentifier());
List<UserGroupUserEntity> userGroupUsers = userGroupEntityController.listUserGroupUsersByUserSchoolDataIdentifier(userSchoolDataIdentifier);
for (UserGroupUserEntity userGroupUser : userGroupUsers) {
UserGroupEntity userGroup = userGroupUser.getUserGroupEntity();
StudentGroupType studentGroupType = identifierMapper.getStudentGroupType(userGroup.getIdentifier());
if (studentGroupType == StudentGroupType.STUDYPROGRAMME) {
boolean archived = Boolean.TRUE.equals(userGroupUser.getArchived());
if (!archived && !isActive) {
fireUserGroupUserRemoved(userGroupUser.getIdentifier(), userGroup.getIdentifier(), identifier.getIdentifier());
}
else {
found = !archived;
}
}
}
if (!found && isActive) {
String userGroupUserIdentifier = identifierMapper.getStudyProgrammeStudentIdentifier(pyramusStudentId);
fireUserGroupUserDiscovered(userGroupUserIdentifier, userGroupIdentifier, identifier.getIdentifier());
}
}
}
}
}
private void handlePyramusUserRemoved(SchoolDataIdentifier identifier) {
UserSchoolDataIdentifier userSchoolDataIdentifier = userSchoolDataIdentifierController.findUserSchoolDataIdentifierByDataSourceAndIdentifier(
identifier.getDataSource(), identifier.getIdentifier());
List<UserGroupUserEntity> userGroupUsers = userGroupEntityController.listUserGroupUsersByUserSchoolDataIdentifier(userSchoolDataIdentifier);
for (UserGroupUserEntity userGroupUser : userGroupUsers) {
UserGroupEntity userGroup = userGroupUser.getUserGroupEntity();
StudentGroupType studentGroupType = identifierMapper.getStudentGroupType(userGroup.getIdentifier());
if (studentGroupType == StudentGroupType.STUDYPROGRAMME) {
fireUserGroupUserRemoved(userGroupUser.getIdentifier(), userGroup.getIdentifier(), identifier.getIdentifier());
}
}
}
private void fireUserGroupUserDiscovered(String userGroupUserIdentifier, String userGroupIdentifier, String userIdentifier) {
schoolDataUserGroupUserDiscoveredEvent.fire(new SchoolDataUserGroupUserDiscoveredEvent(
SchoolDataPyramusPluginDescriptor.SCHOOL_DATA_SOURCE, userGroupUserIdentifier,
SchoolDataPyramusPluginDescriptor.SCHOOL_DATA_SOURCE, userGroupIdentifier,
SchoolDataPyramusPluginDescriptor.SCHOOL_DATA_SOURCE, userIdentifier));
}
@SuppressWarnings("unused")
private void fireUserGroupUserUpdated(String userGroupUserIdentifier, String userGroupIdentifier, String userIdentifier) {
schoolDataUserGroupUserUpdatedEvent.fire(new SchoolDataUserGroupUserUpdatedEvent(
SchoolDataPyramusPluginDescriptor.SCHOOL_DATA_SOURCE, userGroupUserIdentifier,
SchoolDataPyramusPluginDescriptor.SCHOOL_DATA_SOURCE, userGroupIdentifier,
SchoolDataPyramusPluginDescriptor.SCHOOL_DATA_SOURCE, userIdentifier));
}
private void fireUserGroupUserRemoved(String userGroupUserIdentifier, String userGroupIdentifier, String userIdentifier) {
schoolDataUserGroupUserRemovedEvent.fire(new SchoolDataUserGroupUserRemovedEvent(
SchoolDataPyramusPluginDescriptor.SCHOOL_DATA_SOURCE, userGroupUserIdentifier,
SchoolDataPyramusPluginDescriptor.SCHOOL_DATA_SOURCE, userGroupIdentifier,
SchoolDataPyramusPluginDescriptor.SCHOOL_DATA_SOURCE, userIdentifier));
}
}