package eu.dnetlib.contract.cp;

import org.contract4j5.contract.Contract;
import org.contract4j5.contract.Post;
import org.contract4j5.contract.Pre;

import eu.dnetlib.contract.event.IContractEvent;
import eu.dnetlib.contract.node.EvaluationResult;
import eu.dnetlib.contract.node.IContractDefinitionNode;


/**
 * CheckPoint object markup.
 * @author mhorst
 *
 */
@Contract
public interface ICheckPoint<Event extends IContractEvent> extends IContractDefinitionNode {

	public static final String IDENTIFY_DELIMITER = "; ";
		
	/**
	 * Performs check of current CheckPoint object within given context.
	 * @param context current context object
	 * @return CheckPointResult
	 * @throws CheckPointEvaluationException
	 */
	@Pre("event != null")
	@Post("$return != null && $return.status != null")
	public EvaluationResult check(Event event) throws CheckPointEvaluationException; 
	
	/**
	 * Identifies {@link ICheckPoint} instance. Can be useful for logging activities.
	 * @return ICheckPoint instance String representation
	 */
	public String identify();
	
	/**
	 * Returns critical flag.
	 * @return critical flag
	 */
	public boolean isCritical();
	
	/**
	 * Sets critical flag.
	 * @param critical
	 */
	public void setCritical(boolean critical);
	
	/**
	 * Returns related class name.
	 * @return related class name
	 */
	public String getClassName();

	/**
	 * Sets related class name.
	 * @param className
	 */
	public void setClassName(String className);

	/**
	 * Returns related method name.
	 * @return related method name
	 */
	public String getMethodName();

	/**
	 * Sets related method name.
	 * @param methodName
	 */
	public void setMethodName(String methodName);
	
	/**
	 * Returns target bean.
	 * @return target bean
	 */
	public Object getTarget();

	/**
	 * Sets target bean.
	 * @param target
	 */
	public void setTarget(Object target);
	
	/**
	 * Returns supported context class.
	 * @return supported context class
	 */
	@Post("$return != null")
	public Class<? extends IContractEvent> getSupportedEventClass();
}
