package resonantinduction.old.api.coding;

import dan200.computer.api.IComputerAccess;
import dan200.computer.api.ILuaContext;

/**
 * Use to construct a basic task that can be used in any device that supports this interface.
 * 
 * @Note - there are several methods that look a like. GetArgs is used to get the programs arguments
 * that were set by the encoder. GetEncoderParms should be a constant set of arguments that the
 * device can support. GetMemory is a list of variables that the program needs to store outside of
 * the task. That way it can save values after the task has been refreshed or even deleted.
 * 
 * @author DarkGuardsman
 */
public interface IProcessTask extends ITask
{
	/**
	 * Passed in from the device to the program manager then here after a Computer craft machine
	 * calls a this commands method name. {@IPeripheral #callMethod()}
	 */
	public Object[] onCCMethodCalled(IComputerAccess computer, ILuaContext context) throws Exception;

	/**
	 * Called when the task is being run by the devices program manager. Used mainly to setup the
	 * task before actually doing the task.
	 * 
	 * @param world - current world
	 * @param location - current location
	 * @param armbot - armbot instance
	 * @param arguments - arguments for command
	 * @return false to stop the task here.
	 */
	public ProcessReturn onMethodCalled();

	/** Update the current segment of the task */
	public ProcessReturn onUpdate();

	/** Called when the task is finish and then cleared */
	public void terminated();

	public static enum ProcessReturn
	{
		CONTINUE("Continue", "Running"), DONE("Done", "Done"),
		GENERAL_ERROR("General Error", "Error program failure"),
		SYNTAX_ERROR("Syntax Error", "Error incorrect syntax"),
		ARGUMENT_ERROR("Arument error", "Error incorrect arguments");
		public String name, userOutput;

		private ProcessReturn(String name, String userOutput)
		{
			this.name = name;
			this.userOutput = userOutput;
		}
	}

}
