package eu.dnetlib.data.collective.manager;

import java.util.List;

import eu.dnetlib.common.interfaces.nh.IBlackboardMessage.Action;
import eu.dnetlib.data.collective.manager.log.GenericInfoService;
import eu.dnetlib.data.collective.manager.log.LogInfoService;
import eu.dnetlib.data.collective.manager.nh.ServiceActivity;
import eu.dnetlib.data.collective.manager.profile.AbstractInstance;
import eu.dnetlib.data.collective.manager.ui.IUiController;
import eu.dnetlib.data.collective.manager.ui.InstanceNotFoundException;

/**
 * The instance service is the connector between the ui controller and the application logic
 * @author jochen
 *
 */
public interface IInstanceService {

	enum Listmodels {LOG, OAISET};
	
	/**
	 * Initiates the cancelling of a currently running job. Due to the asynchronous processes in manager and worker services this method can only initiate such an action. 
	 * It is usually used in the UI-component
	 * @param aInstanceId
	 * @param aAction
	 * @return true if cancelJob was initiated successfully, false else
	 */
	public abstract boolean cancelJob(String aInstanceId, Action aAction);
	
	/**
	 * get the log info service
	 * @return the log info service
	 */
	public LogInfoService getLogInfoService();
	
	
	/**
	 * get the generic info service
	 * @return the generic info service
	 */
	public GenericInfoService getGenericInfoService();
	
	/**
	 * get the service activity consumer
	 * @return the IWorkerServiceActivityConsumer
	 */
	public IWorkerServiceActivityConsumer getServiceActivityConsumer();
	
	/**
	 * @param uiId
	 * @param aInstanceId
	 * @param obj
	 */
	public abstract void update(String uiId, String aInstanceId, Object obj);
	
	public abstract void update(ServiceActivity aServiceActivity);
	
	public void enableGlobalScheduling(boolean aIsEnabled);
	
	public boolean isGlobalSchedulingEnabled();
	
	public abstract List<?> getAllInstances();
	
	public AbstractInstance getOriginalInstance(String id)  throws InstanceNotFoundException;
	
	public abstract void addUiController(IUiController aUiController);
}
