package eu.dnetlib.contract.similarity.mocks;

import java.util.List;

import pl.edu.icm.yadda.service.search.filter.FilterDefinition;
import pl.edu.icm.yadda.service2.catalog.CountingIterator;
import pl.edu.icm.yadda.service2.exception.ServiceException;
import pl.edu.icm.yadda.service2.similarity.ISimilarityFacade;
import pl.edu.icm.yadda.service2.similarity.SimilarityDocument;
import pl.edu.icm.yadda.service2.similarity.SimilarityQuery;
import pl.edu.icm.yadda.service2.similarity.SimilarityResult;

/**
 * Similarity facade mock. 
 * Each method returns iterator over predefined list of {@link SimilarityResult} objects.
 *  
 * @author mhorst
 *
 */
public class SimilarityFacadeMock implements ISimilarityFacade {

	/**
	 * Predefined result data.
	 */
	private List<SimilarityResult> predefinedResult;
	
	/**
	 * Returns iterator over predefined result.
	 * @return iterator over predefined result
	 * @throws ServiceException 
	 */
	CountingIterator<SimilarityResult> getIteratorOverPredefinedResult(String id) throws ServiceException {
		if (id==null) {
//			for checking exception support
			throw new ServiceException("null id!");
		}
		if (predefinedResult!=null) {
			return new SimpleCountingIterator<SimilarityResult>(
				predefinedResult.toArray(new SimilarityResult[predefinedResult.size()]));
		} else {
			return null;
		}
	}
	
	@Override
	public CountingIterator<SimilarityResult> findSimilar(
			SimilarityDocument arg0) throws ServiceException {
		return getIteratorOverPredefinedResult("");
	}

	@Override
	public CountingIterator<SimilarityResult> findSimilar(String arg0)
			throws ServiceException {
		return getIteratorOverPredefinedResult(arg0);
	}

	@Override
	public CountingIterator<SimilarityResult> findSimilar(
			SimilarityDocument arg0, boolean arg1) throws ServiceException {
		return getIteratorOverPredefinedResult("");
	}

	@Override
	public CountingIterator<SimilarityResult> findSimilar(String arg0,
			boolean arg1) throws ServiceException {
		return getIteratorOverPredefinedResult(arg0);
	}

	@Override
	public CountingIterator<SimilarityResult> findSimilar(SimilarityQuery arg0)
			throws ServiceException {
		return getIteratorOverPredefinedResult("");
	}
	
	@Override
	public void addFilterDefinition(FilterDefinition arg0, boolean arg1)
			throws ServiceException {
		throw new RuntimeException("this method is not implemented in " + 
				this.getClass().getName());
		
	}
	
	@Override
	public void removeFilterDefinition(String arg0) throws ServiceException {
		throw new RuntimeException("this method is not implemented in " + 
				this.getClass().getName());
	}
	
	@Override
	public void checkVersion() {
//		does nothing
	}

	public void setPredefinedResult(List<SimilarityResult> predefinedResult) {
		this.predefinedResult = predefinedResult;
	}

public class SimpleCountingIterator<T> implements CountingIterator<T> {
		
		T[] data;
		
		int currentIdx = 0;
		
		public SimpleCountingIterator(T[] data) {
			this.data = data;
		}
		@Override
		public int count() {
			return data!=null?data.length:0;
		}
		@Override
		public boolean hasNext() {
			return currentIdx<data.length;
		}
		@Override
		public T next() {
			T result = data[currentIdx];
			currentIdx++;
			return result;
		}
		@Override
		public void remove() {
			throw new RuntimeException("unsupported!");			
		}
	}

}
