package org.iatoki.judgels.uriel.controllers;
import com.google.common.collect.ImmutableList;
import org.iatoki.judgels.play.IdentityUtils;
import org.iatoki.judgels.play.InternalLink;
import org.iatoki.judgels.play.JudgelsPlayUtils;
import org.iatoki.judgels.play.LazyHtml;
import org.iatoki.judgels.jophiel.Jophiel;
import org.iatoki.judgels.jophiel.UserActivityMessage;
import org.iatoki.judgels.jophiel.forms.ViewpointForm;
import org.iatoki.judgels.play.controllers.AbstractJudgelsControllerUtils;
import org.iatoki.judgels.play.views.html.layouts.sidebarLayout;
import org.iatoki.judgels.play.views.html.layouts.profileView;
import org.iatoki.judgels.play.views.html.layouts.menusLayout;
import org.iatoki.judgels.jophiel.views.html.client.linkedClientsLayout;
import org.iatoki.judgels.jophiel.views.html.viewas.viewAsLayout;
import org.iatoki.judgels.uriel.UrielUtils;
import org.iatoki.judgels.uriel.services.impls.UserActivityMessageServiceImpl;
import play.data.Form;
import play.i18n.Messages;
import play.mvc.Http;
public final class ControllerUtils extends AbstractJudgelsControllerUtils {
private static ControllerUtils INSTANCE;
private final Jophiel jophiel;
private ControllerUtils(Jophiel jophiel) {
this.jophiel = jophiel;
}
@Override
public void appendSidebarLayout(LazyHtml content) {
ImmutableList.Builder<InternalLink> internalLinkBuilder = ImmutableList.builder();
internalLinkBuilder.add(new InternalLink(Messages.get("contest.contests"), routes.ContestController.index()));
if (isAdmin()) {
internalLinkBuilder.add(new InternalLink(Messages.get("user.users"), routes.UserController.index()));
}
LazyHtml sidebarContent = new LazyHtml(profileView.render(
IdentityUtils.getUsername(),
IdentityUtils.getUserRealName(),
org.iatoki.judgels.jophiel.controllers.routes.JophielClientController.profile(org.iatoki.judgels.uriel.controllers.routes.ApplicationController.afterProfile(routes.ContestController.index().absoluteURL(Http.Context.current().request(), Http.Context.current().request().secure())).absoluteURL(Http.Context.current().request(), Http.Context.current().request().secure())).absoluteURL(Http.Context.current().request(), Http.Context.current().request().secure()),
org.iatoki.judgels.jophiel.controllers.routes.JophielClientController.logout(routes.ApplicationController.index().absoluteURL(Http.Context.current().request(), Http.Context.current().request().secure())).absoluteURL(Http.Context.current().request(), Http.Context.current().request().secure())
));
if (UrielUtils.trullyHasRole("admin")) {
Form<ViewpointForm> form = Form.form(ViewpointForm.class);
if (JudgelsPlayUtils.hasViewPoint()) {
ViewpointForm viewpointForm = new ViewpointForm();
viewpointForm.username = IdentityUtils.getUsername();
form.fill(viewpointForm);
}
sidebarContent.appendLayout(c -> viewAsLayout.render(form, jophiel.getAutoCompleteEndPoint(), "lib/jophielcommons/javascripts/userAutoComplete.js", org.iatoki.judgels.uriel.controllers.routes.ApplicationController.postViewAs(), org.iatoki.judgels.uriel.controllers.routes.ApplicationController.resetViewAs(), c));
}
sidebarContent.appendLayout(c -> menusLayout.render(internalLinkBuilder.build(), c));
sidebarContent.appendLayout(c -> linkedClientsLayout.render(jophiel.getLinkedClientsEndPoint(), "lib/jophielcommons/javascripts/linkedClients.js", c));
content.appendLayout(c -> sidebarLayout.render(sidebarContent.render(), c));
}
public boolean isAdmin() {
return UrielUtils.hasRole("admin");
}
public void addActivityLog(String log) {
try {
if (JudgelsPlayUtils.hasViewPoint()) {
log += " view as " + IdentityUtils.getUserJid();
}
UserActivityMessageServiceImpl.getInstance().addUserActivityMessage(new UserActivityMessage(System.currentTimeMillis(), UrielUtils.getRealUserJid(), log, IdentityUtils.getIpAddress()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static synchronized void buildInstance(Jophiel jophiel) {
if (INSTANCE != null) {
throw new UnsupportedOperationException("ControllerUtils instance has already been built");
}
INSTANCE = new ControllerUtils(jophiel);
}
static ControllerUtils getInstance() {
if (INSTANCE == null) {
throw new UnsupportedOperationException("ControllerUtils instance has not been built");
}
return INSTANCE;
}
}