package eu.dnetlib.data.mdstore;

import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Required;

import eu.dnetlib.enabling.tools.blackboard.BlackboardJob;
import eu.dnetlib.enabling.tools.blackboard.AbstractBlackboardNotificationHandler;
import eu.dnetlib.enabling.tools.blackboard.BlackboardServerHandler;
import eu.dnetlib.enabling.tools.blackboard.NotificationHandler;

/**
 * Handles mock mdstore blackboard messages.
 *
 * @author marko
 *
 */
public class MDStoreMockNotificationHandler extends AbstractBlackboardNotificationHandler<BlackboardServerHandler> implements NotificationHandler {

	/**
	 * logger.
	 */
	private static final Log log = LogFactory.getLog(MDStoreMockNotificationHandler.class); // NOPMD by marko on 11/24/08 5:02 PM

	/**
	 * mdstore service, used to perform the blackboard jobs.
	 */
	private MDStoreServiceMockImpl mdstoreService;

	/**
	 * Possible mdstore blackboard actions.
	 *
	 * @author marko
	 *
	 */
	enum Action {
		/**
		 * create a new mdstore.
		 */
		CREATE,
		/**
		 * delete an existing mdstore.
		 */
		DELETE
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see eu.dnetlib.enabling.tools.blackboard.AbstractBlackboardNotificationHandler#processJob(eu.dnetlib.enabling.tools.blackboard.BlackboardJob)
	 */
	@Override
	protected void processJob(final BlackboardJob job) {
		log.debug("processing blackboard job");

		final Action action = Action.valueOf(job.getAction());
		log.info("processing blackboard action: " + action);

		getBlackboardHandler().ongoing(job);

		try {
			final Map<String, String> param = job.getParameters();
			if (action == Action.DELETE) {
				log.debug("performing delete");

				if (!param.containsKey("id"))
					throw new IllegalArgumentException("missing mandatory 'id' parameter to action " + action);

				mdstoreService.deleteMDStore(param.get("id"));
			} else if (action == Action.CREATE) {
				log.debug("performing create");

				if (!param.containsKey("format"))
					throw new IllegalArgumentException("missing mandatory 'format' parameter to action " + action);

				if (!param.containsKey("interpretation"))
					throw new IllegalArgumentException("missing mandatory 'interpretation' parameter to action " + action);

				if (!param.containsKey("layout"))
					throw new IllegalArgumentException("missing mandatory 'layout' parameter to action " + action);

				final String rsId = mdstoreService.createMDStore(param.get("format"), param.get("interpretation"), param.get("layout"));
				param.put("id", rsId);
			}
		} catch (final Throwable e) {
			getBlackboardHandler().failed(job, e);
			return;
		}

		getBlackboardHandler().done(job);
	}

	public MDStoreServiceMockImpl getMdstoreService() {
		return mdstoreService;
	}

	@Required
	public void setMdstoreService(final MDStoreServiceMockImpl mdstoreService) {
		this.mdstoreService = mdstoreService;
	}


}
