package eu.dnetlib.oai.init.hdfs;

import javax.annotation.Resource;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;

import eu.dnetlib.data.hadoop.config.ClusterName;
import eu.dnetlib.data.hadoop.config.ConfigurationEnumerator;
import eu.dnetlib.data.information.oai.publisher.conf.PublisherConfigurationReader;
import eu.dnetlib.data.information.oai.publisher.info.MDFInfo;
import eu.dnetlib.data.oai.store.mongo.MongoPublisherStore;
import eu.dnetlib.data.oai.store.mongo.MongoPublisherStoreDAO;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class PublisherInitializerHDFSTest {

	/**
	 * Resource under test.
	 */
	private PublisherInitializerHDFS initializer;

	private MDFInfo mdfInfo;
	private final String filePath = "hdfs://nmis-hadoop-cluster/tmp/indexrecords_db_openaireplus_node1_DMF.seq";
	private final Multimap<String, String> indices = ArrayListMultimap.create();
	// # of records to read from the HDFS file. Use -1 to not limit
	private final int readMax = 600;
	private MongoPublisherStore oaiStore;
	@Resource
	private MongoPublisherStoreDAO mongodbPublisherStoreDao;
	@Resource
	private PublisherConfigurationReader publisherConfigurationReaderMock;
	@Resource
	private ConfigurationEnumerator configurationEnumerator;

	// TODO implement this test mocking the hadoop cluster
	// @Before
	public void setUp() throws Exception {
		// hadoop config
		Configuration config = configurationEnumerator.get(ClusterName.DM);
		mdfInfo = new MDFInfo("oaf", "schemaOAF", "http://namespace.openaire.eu/oaf", "hdfsFormat", "hdfsLayout", "hdfsInterpretation", "", true);

		initializer = new PublisherInitializerHDFS(mdfInfo, mongodbPublisherStoreDao, true, new Path(filePath), config, readMax);

		// mocking OAI configuration reader
		// indices
		indices.put("objIdentifier", "//*[local-name() ='objIdentifier']");
		indices.put("set", "//collectedfrom/@name");
		indices.put("datestamp", "//*[local-name() ='dateOfCollection']");
		indices.put("publisher", "//publisher");
		indices.put("license", "//bestlicense/@classID");
		Mockito.when(
				publisherConfigurationReaderMock.getIndices(mdfInfo.getSourceFormatName(), mdfInfo.getSourceFormatInterpretation(),
						mdfInfo.getSourceFormatLayout())).thenReturn(indices);

		oaiStore = mongodbPublisherStoreDao
				.createStore(mdfInfo.getSourceFormatName(), mdfInfo.getSourceFormatInterpretation(), mdfInfo.getSourceFormatLayout());

	}

	// @Test
	public void testSynchronizeContent() {
		initializer.synchronizeContent(oaiStore);
	}
}
