package eu.dnetlib.actionmanager.hbase;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.io.StringReader;
import java.io.StringWriter;

import javax.annotation.Resource;
import javax.xml.transform.Transformer;

import org.apache.commons.io.IOUtils;
import org.dom4j.Document;
import org.dom4j.io.DocumentResult;
import org.dom4j.io.DocumentSource;
import org.dom4j.io.SAXReader;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import eu.dnetlib.actionmanager.ActionManagerConstants.ACTION_TYPE;
import eu.dnetlib.actionmanager.common.Agent;
import eu.dnetlib.actionmanager.common.Agent.AGENT_TYPE;
import eu.dnetlib.actionmanager.common.Operation;
import eu.dnetlib.actionmanager.common.Provenance;
import eu.dnetlib.actionmanager.rmi.ActionManagerException;

@Ignore
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/eu/dnetlib/actionmanager/test/applicationContext-actionmanager-test.xml" })
public class HBaseActionManagerTest {

	@Resource
	private HBaseActionManagerCore core;

	private String dmfInfoPackage;

	private static final String SET = "acus";

	@Before
	public void setUp() throws Exception {
		StringWriter sw = new StringWriter();
		IOUtils.copy(getClass().getResourceAsStream("/eu/dnetlib/actionmanager/test/record.xml"), sw);
		dmfInfoPackage = sw.toString();
	}

	@Test
	public void testBeans() {
		assertNotNull(core);
		assertNotNull(core.getActionFactory());
		assertNotNull(core.getHbaseClient());
	}

	@Test
	public void testXSLT() throws Exception {
		Transformer transformer = core.getActionFactory().prepareXsltTransformer("dmf2actions");
		assertNotNull(transformer);

		Document doc = (new SAXReader()).read(new StringReader(dmfInfoPackage));

		final DocumentResult result = new DocumentResult();
		transformer.transform(new DocumentSource(doc), result);

		int count = result.getDocument().selectNodes("//ACTION").size();
		System.out.println("******************************************");
		System.out.println("N. Actions: " + count);
		System.out.println(result.getDocument().asXML());
		System.out.println("******************************************");

		assertTrue(count > 0);
	}

	@Test
	public void testInfoPackage() throws ActionManagerException {
		Agent a = new Agent("test", "test", AGENT_TYPE.algo);

		core.applyInfoPackageAction("dmf2actions", SET, a, Operation.INSERT, dmfInfoPackage, Provenance.user_claim_driver, "0.5", "acus");
	}

	@Test
	public void testRetrieveActions() throws ActionManagerException {
		core.getHbaseClient().retrieveRows(ACTION_TYPE.aac + "|", null, 10);
	}

}
