package com.intellij.openapi.externalSystem.service.internal;

import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId;
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType;
import org.jetbrains.annotations.NotNull;

import java.rmi.RemoteException;
import java.util.Map;
import java.util.Set;

/**
 * Represents a service that exposes information about the tasks being processed. 
 * 
 * @author Denis Zhdanov
 * @since 2/8/12 1:46 PM
 */
public interface ExternalSystemTaskAware {

  /**
   * Allows to check if current service executes the target task.
   *
   * @param id  target task's id
   * @return    <code>true</code> if a task with the given id is executed at the moment by the current service;
   *            <code>false</code> otherwise
   * @throws RemoteException      as required by RMI
   */
  boolean isTaskInProgress(@NotNull ExternalSystemTaskId id) throws RemoteException;

  /**
   * Allows to cancel the target task by the current service.
   *
   *
   * @param id  target task's id
   * @return    <code>true</code> if a task was successfully canceled;
   *            <code>false</code> otherwise
   * @throws RemoteException      as required by RMI
   */
  boolean cancelTask(@NotNull ExternalSystemTaskId id) throws RemoteException;

  /**
   * Allows to ask current service for all tasks being executed at the moment.  
   *
   * @return      ids of all tasks being executed at the moment grouped by type
   * @throws RemoteException      as required by RMI
   */
  @NotNull
  Map<ExternalSystemTaskType, Set<ExternalSystemTaskId>> getTasksInProgress() throws RemoteException;
}
