package eu.dnetlib.enabling.datastructures;

import java.util.Map;
import java.util.Set;

import com.google.common.collect.Sets;

public class WorkflowInstance implements Comparable<WorkflowInstance> {

	public enum StartMode {
		MANUAL, AUTO, DISABLED
	}

	public enum ConfigurationStatus {
		UNKNOWN, CONFIGURED, NOT_CONFIGURED
	}

	public enum LastExecutionStatus {
		UNKNOWN, SUCCESS, FAILED
	}

	private String wfCode;
	private String wfName;
	private Map<String, String> params;
	private StartMode startMode = StartMode.AUTO;
	private ConfigurationStatus configurationStatus = ConfigurationStatus.UNKNOWN;
	private Set<WorkflowInstance> children = Sets.newHashSet();
	private long lastExecutionDate = 0;
	private LastExecutionStatus lastExecutionStatus = LastExecutionStatus.UNKNOWN;
	private int priority = 50;

	public WorkflowInstance() {}

	public WorkflowInstance(final String wfCode, final String wfName, final Map<String, String> params) {
		this.wfCode = wfCode;
		this.wfName = wfName;
		this.params = params;
	}

	public String getWfCode() {
		return wfCode;
	}

	public void setWfCode(final String wfCode) {
		this.wfCode = wfCode;
	}

	public final String getWfName() {
		return wfName;
	}

	public final void setWfName(final String wfName) {
		this.wfName = wfName;
	}

	public final Map<String, String> getParams() {
		return params;
	}

	public final void setParams(final Map<String, String> params) {
		this.params = params;
	}

	public Set<WorkflowInstance> getChildren() {
		return children;
	}

	public void setChildren(final Set<WorkflowInstance> children) {
		this.children = children;
	}

	@Override
	public int compareTo(final WorkflowInstance wi) {
		return wfCode.compareTo(wi.getWfCode());
	}

	public StartMode getStartMode() {
		return startMode;
	}

	public void setStartMode(final StartMode startMode) {
		this.startMode = startMode;
	}

	public ConfigurationStatus getConfigurationStatus() {
		return configurationStatus;
	}

	public void setConfigurationStatus(final ConfigurationStatus configurationStatus) {
		this.configurationStatus = configurationStatus;
	}

	public final long getLastExecutionDate() {
		return lastExecutionDate;
	}

	public final void setLastExecutionDate(final long lastExecutionDate) {
		this.lastExecutionDate = lastExecutionDate;
	}

	public final LastExecutionStatus getLastExecutionStatus() {
		return lastExecutionStatus;
	}

	public final void setLastExecutionStatus(final LastExecutionStatus lastExecutionStatus) {
		this.lastExecutionStatus = lastExecutionStatus;
	}

	public int getPriority() {
		return priority;
	}

	public void setPriority(final int priority) {
		this.priority = priority;
	}

}
