package fi.otavanopisto.muikku.plugins.wall;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import javax.enterprise.context.Dependent;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import fi.otavanopisto.muikku.events.CourseEntityEvent;
import fi.otavanopisto.muikku.events.CourseUserEvent;
import fi.otavanopisto.muikku.events.Created;
import fi.otavanopisto.muikku.events.UserEntityEvent;
import fi.otavanopisto.muikku.model.users.UserEntity;
import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity;
import fi.otavanopisto.muikku.model.workspace.WorkspaceUserEntity;
import fi.otavanopisto.muikku.plugins.wall.dao.EnvironmentWallDAO;
import fi.otavanopisto.muikku.plugins.wall.dao.UserWallDAO;
import fi.otavanopisto.muikku.plugins.wall.dao.UserWallSubscriptionDAO;
import fi.otavanopisto.muikku.plugins.wall.dao.WallDAO;
import fi.otavanopisto.muikku.plugins.wall.dao.WallEntryDAO;
import fi.otavanopisto.muikku.plugins.wall.dao.WallEntryReplyDAO;
import fi.otavanopisto.muikku.plugins.wall.dao.WorkspaceWallDAO;
import fi.otavanopisto.muikku.plugins.wall.model.EnvironmentWall;
import fi.otavanopisto.muikku.plugins.wall.model.UserWall;
import fi.otavanopisto.muikku.plugins.wall.model.Wall;
import fi.otavanopisto.muikku.plugins.wall.model.WallEntry;
import fi.otavanopisto.muikku.plugins.wall.model.WallEntryReply;
import fi.otavanopisto.muikku.plugins.wall.model.WallEntryVisibility;
import fi.otavanopisto.muikku.plugins.wall.model.WorkspaceWall;
import fi.otavanopisto.muikku.schooldata.WorkspaceController;
import fi.otavanopisto.muikku.session.SessionController;
import fi.otavanopisto.muikku.users.UserEntityController;
import fi.otavanopisto.muikku.users.WorkspaceUserEntityController;
@Dependent
public class WallController {
@Inject
private WorkspaceUserEntityController workspaceUserEntityController;
@Inject
private WallDAO wallDAO;
@Inject
private WallEntryDAO wallEntryDAO;
@Inject
private UserWallDAO userWallDAO;
@Inject
private UserWallSubscriptionDAO userWallLinkDAO;
@Inject
private SessionController sessionController;
@Inject
private WorkspaceWallDAO workspaceWallDAO;
@Inject
private WallEntryReplyDAO wallEntryCommentDAO;
@Inject
private EnvironmentWallDAO environmentWallDAO;
@Inject
private UserEntityController userEntityController;
@Inject
private WallEntryReplyDAO wallEntryReplyDAO;
@Inject
private WorkspaceController workspaceController;
@Inject
@Any
private Instance<WallEntryProvider> wallEntryProviders;
// public WallEntryTextItem createWallEntryTextItem(AbstractWallEntry entry, String text, UserEntity user) {
// return wallEntryTextItemDAO.create(entry, text, user);
// }
//
// public List<UserFeedItem> listUserFeedItems(UserEntity user) {
// List<UserFeedItem> feedItems = new ArrayList<UserFeedItem>();
// UserEntity loggedUser = sessionController.isLoggedIn() ? sessionController.getUser() : null;
// UserWall wall = userWallDAO.findByUser(user);
// boolean ownsWall = loggedUser != null ? loggedUser.getId().equals(user.getId()) : false;
// boolean hasAccess = sessionController.hasEnvironmentPermission(MuikkuPermissions.READ_ALL_WALLS);
//
// if (ownsWall || hasAccess) {
// /**
// * Full access grants full listing of both the users wall and all linked walls
// */
// List<WallEntry> entriesByWall = wallEntryDAO.listEntriesByWall(wall);
//
// for (WallEntry entry : entriesByWall) {
// feedItems.add(new UserFeedWallEntryItem(entry));
// }
//
// List<WallSubscription> subscriptions = wallSubscriptionDAO.listByUser(user);
// for (WallSubscription subscription : subscriptions) {
// switch (subscription.getType()) {
// case WALL:
// UserWallSubscription userWallSubscription = userWallLinkDAO.findById(subscription.getId());
//
// List<WallEntry> userWallSubEntries = wallEntryDAO.listEntriesByWall(userWallSubscription.getWall());
// for (WallEntry entry : userWallSubEntries) {
// feedItems.add(new UserFeedWallEntryItem(entry));
// }
//
// break;
// case FORUM:
// ForumAreaSubscription forumAreaSubscription = forumAreaSubscriptionDAO.findById(subscription.getId());
//
// ForumArea forumArea = forumAreaSubscription.getForumArea();
//
// List<ForumThread> forumThreads = forumThreadDAO.listByForumArea(forumArea);
//
// for (ForumThread thread : forumThreads) {
// List<ForumThreadReply> replies = forumThreadReplyDAO.listByForumThread(thread);
// feedItems.add(new UserFeedForumThreadItem(thread, replies));
// }
// break;
// }
// }
// } else {
// System.out.println("No rights for feed of user x");
// }
// return orderUserFeed(feedItems);
// }
public List<WallFeedItem> listWallFeed(Wall wall) {
if (wall == null)
return null;
List<WallFeedItem> entries = new ArrayList<WallFeedItem>();
for (WallEntryProvider provider : wallEntryProviders) {
entries.addAll(provider.listWallEntryItems(wall));
}
if (wall instanceof UserWall) {
UserWall userWall = findUserWallById(wall.getId());
UserEntity userEntity = userEntityController.findUserEntityById(userWall.getUser());
// Friends
// ...
// Users Workspaces
List<WorkspaceUserEntity> workspaceUsers = workspaceUserEntityController.listWorkspaceUserEntitiesByUserEntity(userEntity);
for (WorkspaceUserEntity workspaceUser : workspaceUsers) {
WorkspaceWall workspaceWall = getWorkspaceWall(workspaceUser.getWorkspaceEntity());
for (WallEntryProvider provider : wallEntryProviders) {
entries.addAll(provider.listWallEntryItems(workspaceWall));
}
}
}
return orderUserFeed(entries);
}
// public List<WallEntry> listWallEntries(Wall wall) {
// // TODO
// if (wall == null)
// return null;
//
// List<WallEntry> entries = new ArrayList<WallEntry>();
// switch (wall.getWallType()) {
// case USER: {
// UserWall userWall = userWallDAO.findById(wall.getId());
//
// UserEntity wallOwner = userController.findUserEntityById(userWall.getUser());
// UserEntity loggedUser = sessionController.isLoggedIn() ? sessionController.getUser() : null;
//
// boolean ownsWall = loggedUser != null ? loggedUser.getId().equals(wallOwner.getId()) : false;
// boolean hasAccess = sessionController.hasEnvironmentPermission(MuikkuPermissions.READ_ALL_WALLS);
//
// if (ownsWall || hasAccess) {
// /**
// * Full access grants full listing of both the users wall and all linked walls
// */
// entries.addAll(wallEntryDAO.listEntriesByWall(wall));
// } else {
// /**
// * When viewing other peoples walls, you only see public or owned entries
// */
//
// entries.addAll(wallEntryDAO.listPublicOrOwnedEntriesByWall(wall, loggedUser));
// }
// }
// break;
//
// case WORKSPACE:
// WorkspaceWall courseWall = courseWallDAO.findById(wall.getId());
//
// WorkspaceEntity course = workspaceController.findWorkspaceEntityById(courseWall.getWorkspace());
//
// if (sessionController.hasCoursePermission(MuikkuPermissions.WALL_READALLCOURSEMESSAGES, course)) {
// entries.addAll(wallEntryDAO.listEntriesByWall(courseWall));
// } else {
// entries.addAll(wallEntryDAO.listPublicOrOwnedEntriesByWall(courseWall, sessionController.getUser()));
// }
// break;
//
// case ENVIRONMENT:
// // TODO: oikeudet?
// entries.addAll(wallEntryDAO.listEntriesByWall(wall));
// break;
// }
// return orderWallEntries(entries);
// }
// public List<WallEntryItem> listWallEntryItems(AbstractWallEntry wallEntry) {
// // TODO: oikeudet
// return abstractWallEntryItemDAO.listByWallEntry(wallEntry);
// }
public List<WallEntryReply> listWallEntryComments(WallEntry wallEntry) {
return wallEntryCommentDAO.listByWallEntry(wallEntry);
}
public boolean canPostEntry(Wall wall) {
if (wall instanceof EnvironmentWall) {
return sessionController.hasEnvironmentPermission(WallPermissions.WALL_WRITEENVIRONMENTWALL);
}
if (wall instanceof WorkspaceWall) {
WorkspaceWall courseWall = (WorkspaceWall) wall;
return sessionController.hasWorkspacePermission(WallPermissions.WALL_WRITECOURSEWALL,
workspaceController.findWorkspaceEntityById(courseWall.getWorkspace()));
}
if (wall instanceof UserWall) {
return true;
}
return false;
}
public EnvironmentWall getEnvironmentWall() {
EnvironmentWall environmentWall = environmentWallDAO.find();
if (environmentWall == null)
environmentWall = environmentWallDAO.create();
return environmentWall;
}
public UserWall getUserWall(UserEntity user) {
UserWall userWall = userWallDAO.findByUser(user);
// // TODO
// if (userWall == null)
// userWall = userWallDAO.create(user);
return userWall;
}
public WorkspaceWall getWorkspaceWall(WorkspaceEntity workspace) {
WorkspaceWall workspaceWall = workspaceWallDAO.findByWorkspace(workspace);
return workspaceWall;
}
public String getWallType(Wall wall) {
return wall.getClass().getSimpleName();
}
public boolean showContext(Wall wall, WallEntry wallEntry) {
// Don't show context for entries on the wall we're currently viewing
return !wallEntry.getWall().getId().equals(wall.getId());
}
private List<WallFeedItem> orderUserFeed(List<WallFeedItem> entries) {
Collections.sort(entries, new Comparator<WallFeedItem>() {
@Override
public int compare(WallFeedItem o1, WallFeedItem o2) {
Date d1 = o1.getDate();
Date d2 = o2.getDate();
return d2.compareTo(d1);
}
});
return entries;
}
// private List<WallEntry> orderWallEntries(List<WallEntry> entries) {
// Collections.sort(entries, new Comparator<WallEntry>() {
//
// @Override
// public int compare(WallEntry o1, WallEntry o2) {
// Date d1 = wallEntryCommentDAO.findMaxDateByWallEntry(o1);
// Date d2 = wallEntryCommentDAO.findMaxDateByWallEntry(o2);
//
// d1 = d1 != null ? d1 : o1.getCreated();
// d2 = d2 != null ? d2 : o2.getCreated();
//
// return d2.compareTo(d1);
// }
// });
//
// return entries;
// }
public WallEntry createWallEntry(Wall wall, String text, WallEntryVisibility visibility, UserEntity user) {
return wallEntryDAO.create(wall, text, visibility, user);
}
public WallEntryReply createWallEntryReply(Wall wall, WallEntry wallEntry, String text, UserEntity user) {
return wallEntryReplyDAO.create(wall, wallEntry, text, user);
}
public WorkspaceWall createWorkspaceWall(WorkspaceEntity workspaceEntity) {
return workspaceWallDAO.create(workspaceEntity);
}
public UserWall createUserWall(UserEntity userEntity) {
return userWallDAO.create(userEntity);
}
public WallEntry findWallEntryById(Long wallEntryId) {
return wallEntryDAO.findById(wallEntryId);
}
public Wall findWallById(Long wallId) {
return wallDAO.findById(wallId);
}
public UserWall findUserWallById(Long wallId) {
return userWallDAO.findById(wallId);
}
public UserWall findUserWall(UserEntity userEntity) {
return userWallDAO.findByUser(userEntity);
}
public List<String> listRequiredJSFiles() {
List<String> result = new ArrayList<String>();
for (WallEntryProvider wallEntryProvider : wallEntryProviders) {
List<String> v = wallEntryProvider.listRequiredJavaScripts();
if (v != null)
result.addAll(v);
}
return result;
}
public void onCourseCreateEvent(@Observes @Created CourseEntityEvent event) {
WorkspaceEntity courseEntity = workspaceController.findWorkspaceEntityById(event.getCourseEntityId());
workspaceWallDAO.create(courseEntity);
}
public void onCourseUserCreateEvent(@Observes @Created CourseUserEvent event) {
throw new RuntimeException("TODO: Implement");
// CourseUser courseUser = workspaceController.findCourseUserById(event.getCourseUserId());
// WorkspaceWall courseWall = courseWallDAO.findByCourse(courseUser.getCourse());
//
// userWallLinkDAO.create(courseUser.getUser(), courseWall);
}
public void onUserCreatedEvent(@Observes @Created UserEntityEvent event) {
/**
* Create User Wall
*/
UserEntity userEntity = userEntityController.findUserEntityById(event.getUserEntityId());
UserWall userWall = userWallDAO.create(userEntity);
// WallEntry wallEntry =
wallEntryDAO.create(userWall, "Joined Muikku", WallEntryVisibility.PRIVATE, userEntity);
/**
* Link Environment wall
*/
EnvironmentWall environmentWall = environmentWallDAO.find();
userWallLinkDAO.create(userEntity, environmentWall);
}
public WorkspaceWall findWorkspaceWall(WorkspaceEntity workspaceEntity) {
return workspaceWallDAO.findByWorkspace(workspaceEntity);
}
public WorkspaceWall findWorkspaceWallById(Long id) {
return workspaceWallDAO.findById(id);
}
}