package fi.otavanopisto.muikku.plugins.guidancerequest;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import org.apache.commons.lang3.NotImplementedException;
import fi.otavanopisto.muikku.controller.messaging.MessagingWidget;
import fi.otavanopisto.muikku.i18n.LocaleController;
import fi.otavanopisto.muikku.model.users.UserEntity;
import fi.otavanopisto.muikku.model.users.UserGroupEntity;
import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity;
import fi.otavanopisto.muikku.notifier.NotifierController;
import fi.otavanopisto.muikku.schooldata.entity.User;
import fi.otavanopisto.muikku.session.SessionController;
import fi.otavanopisto.muikku.users.UserController;
import fi.otavanopisto.security.PermissionResolver;
import fi.otavanopisto.security.Permit;
import fi.otavanopisto.security.PermitContext;
@Dependent
public class GuidanceRequestController {
@Inject
private GuidanceRequestDAO guidanceRequestDAO;
@Inject
private WorkspaceGuidanceRequestDAO workspaceGuidanceRequestDAO;
@Inject
private UserController userController;
@Inject
private SessionController sessionController;
@Inject
private LocaleController localeController;
// @Inject
// private Mailer mailer;
@Inject
private NotifierController notifierController;
@Inject
@Any
private Instance<MessagingWidget> messagingWidgets;
@Inject
@Any
private Instance<PermissionResolver> permissionResolvers;
@Inject
private GuidanceRequestNotification guidanceRequestNotification;
protected PermissionResolver getPermissionResolver(String permission) {
for (PermissionResolver resolver : permissionResolvers) {
if (resolver.handlesPermission(permission))
return resolver;
}
return null;
}
@Permit (GuidanceRequestPermissions.CREATE_GUIDANCEREQUEST)
public GuidanceRequest createGuidanceRequest(UserEntity student, Date date, String message) {
GuidanceRequest guidanceRequest = guidanceRequestDAO.create(student, date, message);
// Send message
// TODO: Make this cleaner, it smells like fish.
List<UserEntity> recipients = new ArrayList<UserEntity>();
getPermissionResolver(GuidanceRequestPermissions.RECEIVE_USERGROUP_GUIDANCEREQUESTS);
/*
List<UserGroup> studentsGroups = userGroupController.listUserGroupsByUser(student);
for (UserGroup group : studentsGroups) {
List<UserGroupUser> groupUsers = userGroupController.listUserGroupUsers(group);
for (UserGroupUser groupUser : groupUsers) {
if (per.hasPermission(GuidanceRequestPermissions.RECEIVE_USERGROUP_GUIDANCEREQUESTS, group, groupUser.getUser()))
recipients.add(groupUser.getUser());
}
}
*/
if (!recipients.isEmpty()) {
User user = userController.findUserByDataSourceAndIdentifier(sessionController.getLoggedUserIdentifier(), sessionController.getLoggedUserIdentifier());
String userName = user.getFirstName() + " " + user.getLastName();
String caption = localeController.getText(sessionController.getLocale(), "plugin.guidancerequest.newGuidanceRequest.mail.subject");
String content = localeController.getText(sessionController.getLocale(), "plugin.guidancerequest.newGuidanceRequest.mail.content");
caption = MessageFormat.format(caption, userName);
content = MessageFormat.format(content, userName, message);
for (MessagingWidget messagingWidget : messagingWidgets) {
messagingWidget.postMessage(student, caption, GuidanceRequestPluginDescriptor.MESSAGING_CATEGORY, content, recipients);
}
Map<String, Object> params = new HashMap<String, Object>();
params.put("guidanceRequest", guidanceRequest);
notifierController.sendNotification(guidanceRequestNotification, student, recipients, params);
}
return guidanceRequest;
}
@Permit (GuidanceRequestPermissions.CREATE_WORKSPACE_GUIDANCEREQUEST)
public GuidanceRequest createWorkspaceGuidanceRequest(@PermitContext WorkspaceEntity workspaceEntity, UserEntity student, Date date, String message) {
return workspaceGuidanceRequestDAO.create(workspaceEntity, student, date, message);
}
@Permit (GuidanceRequestPermissions.LIST_WORKSPACE_GUIDANCEREQUESTS)
public List<WorkspaceGuidanceRequest> listWorkspaceGuidanceRequestsByWorkspace(@PermitContext WorkspaceEntity workspaceEntity) {
return workspaceGuidanceRequestDAO.listByWorkspace(workspaceEntity);
}
/**
* TODO: methods that return owned guidancerequests and if the user has managed groups, also the group's users' requests
*/
// TODO rights
public List<GuidanceRequest> listGuidanceRequestsByStudent(UserEntity student) {
return guidanceRequestDAO.listByStudent(student);
}
@Permit (GuidanceRequestPermissions.RECEIVE_USERGROUP_GUIDANCEREQUESTS)
public List<GuidanceRequest> listGuidanceRequestsByGroup(@PermitContext UserGroupEntity group) {
/*
List<UserGroupUser> users = userGroupController.listUserGroupUsers(group);
List<GuidanceRequest> list = new ArrayList<GuidanceRequest>();
for (UserGroupUser user : users) {
list.addAll(guidanceRequestDAO.listByStudent(user.getUser()));
}
return list;
*/
throw new NotImplementedException("User groups are not usable yet");
}
public List<GuidanceRequest> listGuidanceRequestsByManager(UserEntity manager) {
getPermissionResolver(GuidanceRequestPermissions.RECEIVE_USERGROUP_GUIDANCEREQUESTS);
/*
List<UserGroup> managedGroups = userGroupController.listUserGroupsByUser(manager);
List<GuidanceRequest> list = new ArrayList<GuidanceRequest>();
for (UserGroup group : managedGroups) {
if (per.hasPermission(GuidanceRequestPermissions.RECEIVE_USERGROUP_GUIDANCEREQUESTS, group, manager)) {
List<GuidanceRequest> byGroup = listGuidanceRequestsByGroup(group);
if (byGroup != null)
list.addAll(byGroup);
}
}
return list;
*/
throw new NotImplementedException("User groups are not usable yet");
}
public List<WorkspaceGuidanceRequest> listWorkspaceGuidanceRequestsByWorkspaceAndUser(WorkspaceEntity workspaceEntity,
UserEntity userEntity) {
return workspaceGuidanceRequestDAO.listByWorkspaceAndUser(workspaceEntity, userEntity);
}
}