package edu.harvard.iq.dataverse;

import edu.harvard.iq.dataverse.authorization.users.User;
import edu.harvard.iq.dataverse.search.IndexAllServiceBean;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.json.JsonObjectBuilder;

@SessionScoped
@Named("SuperUserPage")
public class SuperUserPage implements java.io.Serializable {

    @Inject
    DataverseSession session;

    @EJB
    IndexServiceBean indexService;
    @EJB
    IndexAllServiceBean indexAllService;

    private String indexAllStatus = "No status available";

    private Future<JsonObjectBuilder> indexAllFuture;

    // modeled off http://docs.oracle.com/javaee/7/tutorial/ejb-async002.htm
    public String getIndexAllStatus() {
        if (indexAllFuture != null) {
            if (indexAllFuture.isDone()) {
                try {
                    JsonObjectBuilder status = indexAllFuture.get();
                    indexAllStatus = status.build().toString();
                } catch (ExecutionException | CancellationException | InterruptedException ex) {
                    indexAllStatus = ex.getCause().toString();
                }
            } else {
                indexAllStatus = "Index all is running...";
            }
        }
        return indexAllStatus;
    }

    public void startIndexAll() {
        User user = session.getUser();
        if (user.isSuperuser()) {
            long numPartitions = 1;
            long partitionId = 0;
            boolean previewOnly = false;
            indexAllFuture = indexAllService.indexAllOrSubset(numPartitions, partitionId, false, previewOnly);
            indexAllStatus = "Index all started...";
        } else {
            indexAllStatus = "Only a superuser can run index all";
        }
    }

    public void updateIndexAllStatus() {
        getIndexAllStatus();
    }

}
