package eu.dnetlib.contract.similarity.mocks;

import java.util.ArrayList;
import java.util.List;

import javax.xml.ws.wsaddressing.W3CEndpointReference;

import org.apache.log4j.Logger;

import eu.dnetlib.contract.utils.FileUtils;
import eu.dnetlib.enabling.resultset.rmi.ResultSetException;
import eu.dnetlib.enabling.resultset.rmi.ResultSetService;

/**
 * ResultSet mock used for testing blackboard related contracts.
 * 
 * @author mhorst
 *
 */
public class ResultSetMock implements ResultSetService {

	protected final Logger log = Logger.getLogger(this.getClass()); 
	
	boolean providedAllResults = false;
	
	String[] data;
	
	int numberOfRecords = 1;
	
	public void init() throws Exception {
		log.debug("preloading " + numberOfRecords + " records");
		data = new String[numberOfRecords];
		String indexRecordContent = FileUtils.getFileContent(
				"classpath:eu/dnetlib/contract/similarity/mocks/" +
				"index_record_0.xml");
		for (int i=0; i<numberOfRecords; i++) {
			data[i] = indexRecordContent;
		}
		log.debug("preloading finished!");
	}
	
	@Override
	public void closeRS(String arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public W3CEndpointReference createPullRS(String arg0, String arg1,
			int arg2, int arg3, String arg4, Integer arg5, Integer arg6) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public W3CEndpointReference createPullRSEPR(W3CEndpointReference arg0,
			String arg1, int arg2, int arg3, String arg4, Integer arg5,
			Integer arg6) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public W3CEndpointReference createPushRS(int arg0, int arg1)
			throws ResultSetException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int getNumberOfElements(String arg0) throws ResultSetException {
		return data.length;
	}

	@Override
	public String getProperty(String arg0, String arg1)
			throws ResultSetException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getRSStatus(String arg0) throws ResultSetException {
		return providedAllResults?"closed":"open";
	}

	@Override
	public List<String> getResult(String arg0, int arg1, int arg2, String arg3)
			throws ResultSetException {
		if (arg2==numberOfRecords) {
			providedAllResults = true;
		}
		return getSubList(data, arg1-1, arg2-1);
	}

	List<String> getSubList(String[] source, int startIncl, int endIncl) {
		List<String> result = new ArrayList<String>();
		for (int i=startIncl; i<source.length || i<=endIncl ; i++) {
			result.add(source[i]);
		}
		log.info("returning "+result.size()+" results");
		return result;
	}
	
	@Override
	public String populateRS(String arg0, List<String> arg1)
			throws ResultSetException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String identify() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void notify(String arg0, String arg1, String arg2, String arg3) {
		// TODO Auto-generated method stub

	}

	@Override
	public void start() {
		// TODO Auto-generated method stub

	}

	public void setNumberOfRecords(int numberOfRecords) {
		this.numberOfRecords = numberOfRecords;
	}

}
