package eu.dnetlib.msro.dispatcher;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.google.common.collect.Maps;

import eu.dnetlib.enabling.datastructures.MetaWorkflow;
import eu.dnetlib.enabling.datastructures.WorkflowInstance;
import eu.dnetlib.miscutils.DateUtils;

public class WorkflowRegistry {

	final Map<String, ProcessInfo> procs = Maps.newHashMap();

	private String previousGeneratedId;

	private static final Log log = LogFactory.getLog(WorkflowRegistry.class);

	public ProcessInfo registerProcess(final MetaWorkflow metaWf, final WorkflowInstance wfi) {
		final String procId = generateProcessId();
		procs.put(procId, new ProcessInfo(
				procId,
				metaWf.getCode(),
				wfi.getWfName(),
				metaWf.getFamily(),
				metaWf.getDatasourceName(),
				DateUtils.now(),
				wfi.getPriority()));
		return procs.get(procId);
	}

	public ProcessInfo registerProcess(final WorkflowInstance wfi) {
		final String procId = generateProcessId();
		return procs.put(procId, new ProcessInfo(procId, "", wfi.getWfName(), "", "", DateUtils.now(), wfi.getPriority()));
	}

	public ProcessInfo findProcess(final String procId) {
		return procs.get(procId);
	}

	public Set<String> listProcIds() {
		return procs.keySet();
	}

	private synchronized String generateProcessId() {
		String id = "";
		do {
			id = "proc-" + new SimpleDateFormat("yyyyMMdd_HHmmss_S").format(new Date());
			log.info("Generated processID " + id);
		} while (id.equals(previousGeneratedId));

		previousGeneratedId = id;

		return id;
	}
}
