package eu.dnetlib.data.resultSet;

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

import com.google.common.base.Function;

import eu.dnetlib.enabling.datastructures.TransformationRule;
import eu.dnetlib.enabling.is.client.InformationServiceClient;
import eu.dnetlib.rmi.objects.resultSet.ResultSet;

public class ResultSetFactory {

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

	private ResultSetServiceImpl service;

	private ResultSetRegistry registry;

	@Autowired
	private InformationServiceClient isClient;

	public <T> ResultSet<T> createResultSet(final ResultSetIterator<T> iter) {
		final String rsId = registry.registerIterator(iter);
		final String protocol = service.getMainProtocol();
		return new ResultSet<T>(rsId, protocol, service.getProtocols().get(protocol));
	}

	public <T> ResultSet<T> createResultSet(final Iterable<T> iter) {
		return createResultSet(new IterableResultSetIterator<T>(iter));
	}

	public <T, K> ResultSet<T> transform(final ResultSet<K> rs, final Function<K, T> function) {
		// TODO
		return null;
	}

	public ResultSet<String> transform(final ResultSet<String> rs, final String ruleId) {
		// TODO
		return null;
	}

	public ResultSet<String> transform(final ResultSet<String> rs, final TransformationRule rule) {
		// TODO
		return null;
	}

	public ResultSetServiceImpl getService() {
		return service;
	}

	@Required
	public void setService(final ResultSetServiceImpl service) {
		this.service = service;
	}

	public ResultSetRegistry getRegistry() {
		return registry;
	}

	@Required
	public void setRegistry(final ResultSetRegistry registry) {
		this.registry = registry;
	}

}
