package eu.dnetlib.common.services;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

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

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import eu.dnetlib.common.services.locators.DnetServiceLocator;
import eu.dnetlib.rmi.objects.is.DnetService;
import eu.dnetlib.rmi.soap.BaseService;
import eu.dnetlib.rmi.soap.InformationService;
import eu.dnetlib.rmi.soap.exceptions.InformationServiceException;

public abstract class AbstractBaseService implements BaseService, SmartLifecycle {

	/**
	 * logger.
	 */
	private static final Log log = LogFactory.getLog(AbstractBaseService.class);

	private boolean running = false;

	private boolean autoStartup = true;

	private String mainProtocol = "SOAP";

	@Resource
	private DnetServiceLocator serviceLocator;

	private String serviceId = null;
	private Map<String, String> properties = Maps.newHashMap();
	private Map<String, String> protocols = Maps.newHashMap();
	private List<BlackboardAction<?>> blackboardActions = Lists.newArrayList();

	@Override
	public DnetService identify() {
		try {
			return serviceId != null ? serviceLocator.getService(InformationService.class).getService(serviceId) : null;
		} catch (InformationServiceException e) {
			log.error("Error obtaining details of service: " + serviceId);
			return null;
		}
	}

	@Override
	public void start() {
		if (running) {
			log.warn("Service " + this + " already started, check bean initializations!");
			return;
		}
		this.running = true;
	}

	@Override
	public boolean isRunning() {
		log.debug("called isRunning " + this);
		return running;
	}

	protected void setRunning(final boolean running) {
		this.running = running;
	}

	@Override
	public void stop() {
		log.info("*** Stopping service " + this);
		this.running = false;
	}

	@Override
	public int getPhase() {
		return 0;
	}

	@Override
	public boolean isAutoStartup() {
		return autoStartup;
	}

	@Override
	public void stop(final Runnable callback) {
		stop();
		callback.run();
	}

	public void setAutoStartup(final boolean autoStartup) {
		this.autoStartup = autoStartup;
	}

	public Map<String, String> getProperties() {
		return properties;
	}

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

	public Map<String, String> getProtocols() {
		return protocols;
	}

	@Required
	public void setProtocols(final Map<String, String> protocols) {
		this.protocols = protocols;
	}

	public String getServiceId() {
		return serviceId;
	}

	public void setServiceId(final String serviceId) {
		this.serviceId = serviceId;
	}

	public String getMainProtocol() {
		return mainProtocol;
	}

	public void setMainProtocol(final String mainProtocol) {
		this.mainProtocol = mainProtocol;
	}

	public List<BlackboardAction<?>> getBlackboardActions() {
		return blackboardActions;
	}

	public void setBlackboardActions(final List<BlackboardAction<?>> blackboardActions) {
		this.blackboardActions = blackboardActions;
	}

}
