package eu.dnetlib.data.utility.cleaner;


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

import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.xml.ws.wsaddressing.W3CEndpointReference;

import org.dom4j.Document;
import org.dom4j.io.SAXReader;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import eu.dnetlib.data.utility.cleaner.rmi.CleanerService;
import eu.dnetlib.enabling.resultset.rmi.ResultSetException;
import eu.dnetlib.enabling.resultset.rmi.ResultSetService;
import eu.dnetlib.enabling.tools.ServiceLocator;
import eu.dnetlib.enabling.tools.ServiceResolver;
import eu.dnetlib.test.AbstractIntegrationContainerTest;

@RunWith(SpringJUnit4ClassRunner.class)
public class CleanerServiceTest extends AbstractIntegrationContainerTest {
	/**
	 * Service under test. 
	 */
	private CleanerService cleanerService;
	
	/**
	 * result set service locator.
	 */
	@Resource(name = "resultSetLocator")
	private transient ServiceLocator<ResultSetService> resultSetLocator;

	/**
	 * Cleaner service locator.
	 */
	@Resource(name = "cleanerLocator")
	private transient ServiceLocator<CleanerService> cleanerLocator;

	/**
	 * service resolver.
	 */
	@Resource
	private transient ServiceResolver serviceResolver;
	
	/**
	 * EPR of input resultset.
	 */
	private W3CEndpointReference eprInput;

	
	private static final String RULE_ID = "RULE_TEST";

	private static final int RS_SIZE = 23;
	
	
	@Before
	public void setUp() throws Exception {
		cleanerService = cleanerLocator.getService();
		eprInput = generateInput();
	}
	
	private W3CEndpointReference generateInput() throws ResultSetException {
		ResultSetService resultset = resultSetLocator.getService();
		W3CEndpointReference epr = resultset.createPushRS(1000, 1000);
		String rsId = serviceResolver.getResourceIdentifier(epr);
		
		List<String> list = new ArrayList<String>();
		for (int i=0; i<RS_SIZE; i++) {
			list.add("<a><b>SHDGAD_" + i + "_DFSGHA</b><c>DHJ_" + i + "_DJK</c><d>aXa</d></a>");
		}
		
		resultset.populateRS(rsId, list);
		resultset.closeRS(rsId);

		return epr;
	}

	@Test
	public void testClean() throws Exception {
		W3CEndpointReference eprResponse = cleanerService.clean(eprInput, RULE_ID);
		
		ResultSetService resultSet = serviceResolver.getService(ResultSetService.class, eprResponse);
		String rsId = serviceResolver.getResourceIdentifier(eprResponse);
		
		assertEquals(RS_SIZE, resultSet.getNumberOfElements(rsId));
		SAXReader reader = new SAXReader();
		for (String s : resultSet.getResult(rsId, 1, RS_SIZE, "WAITING")) {
			Document doc = reader.read(new StringReader(s));
			String v1 = doc.valueOf("/a/b");
			String v2 = doc.valueOf("/a/c");
			String v3 = doc.valueOf("/a/d");
			
			assertEquals(v1.toLowerCase(), v1);
			assertTrue("starts with 123", v1.startsWith("123"));
			assertTrue("ends with 321", v1.endsWith("321"));
			assertEquals("HELLO", v2);
			assertEquals("aYa", v3);
		}
	}

}
