import static org.junit.Assert.assertNotNull;
import eu.dnetlib.api.enabling.ISRegistryService;
import eu.dnetlib.api.enabling.ISRegistryServiceException;
import eu.dnetlib.domain.enabling.SecurityProfile;
import eu.dnetlib.domain.functionality.UserProfile;
import eu.dnetlib.domain.functionality.UserProfileSearchCriteria;
import eu.dnetlib.enabling.is.registry.rmi.ISRegistryException;
import eu.dnetlib.soap.EndpointReferenceBuilder;
import gr.uoa.di.driver.enabling.ISLookUp;
import gr.uoa.di.driver.enabling.ISLookUpException;
import gr.uoa.di.driver.xml.UserProfileXmlConverter;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import javax.xml.bind.JAXBException;
import javax.xml.ws.Endpoint;
import javax.xml.ws.wsaddressing.W3CEndpointReference;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSetup {

	private static ApplicationContext context = null;

	@BeforeClass
	public static void setup() {
		try {
			context = new ClassPathXmlApplicationContext(
					new String[] { 
							"classpath*:/**/springContext-profileService.xml",
							"classpath*:/gr/uoa/di/driver/app/springContext-commons.xml",
							"classpath*:/gr/uoa/di/driver/util/springContext-locators.xml", 
							"classpath*:/eu/dnetlib/clients/ws/springContext-cxf.xml", 
							"classpath*:/eu/dnetlib/utils/springContext-epr.xml",
							"file:src/webapp/WEB-INF/applicationContext.xml"
							});

		} catch (Throwable t) {
			t.printStackTrace();
		}
	}

	private static String readFileAsString(String filePath)
			throws java.io.IOException {
		StringBuffer fileData = new StringBuffer(1000);
		BufferedReader reader = new BufferedReader(new FileReader(filePath));
		char[] buf = new char[1024];
		int numRead = 0;
		while ((numRead = reader.read(buf)) != -1) {
			fileData.append(buf, 0, numRead);
		}
		reader.close();
		return fileData.toString();
	}

	@AfterClass
	public static void tearDown() {
		((ConfigurableApplicationContext) context).close();
	}
	
	@Test
	public void testSchema() throws IOException, JAXBException {
		// add user profile schema
		eu.dnetlib.enabling.is.registry.rmi.ISRegistryService reg = (eu.dnetlib.enabling.is.registry.rmi.ISRegistryService) context
				.getBean("registryPortType");

		try {
			String schema =
				readFileAsString("/home/antleb/projects/dnet1/driver-clients/xsd/userProfileResourceSchema.xsd");
			String type = new UserProfile().getResourceType();
			//			
			// System.out.println("resource type: " + type);
			// System.out.println("adding schema: \n" + schema);
			//
			reg.addResourceType(type, schema);

			reg.addResourceType(new SecurityProfile().getResourceType(),
					readFileAsString("/home/antleb/projects/dnet1/driver-clients/xsd/securityProfile.xsd"));

		} catch (ISRegistryException e) {
			e.printStackTrace();
		}
	}
	
	@SuppressWarnings("unchecked")
	@Test
	public void testQuery() throws ISLookUpException {
		ISLookUp<UserProfile> lookup = (ISLookUp<UserProfile>) context.getBean("userLookUp");
		
		System.out.println(lookup.search(new UserProfileSearchCriteria()).getEpr());
		
		
	}

//	@Test
	public void testRegistryWSClient() {
		try {
			UserProfile user = new UserProfile();
			UserProfileXmlConverter conv = new UserProfileXmlConverter();

			user.setEmail("antleb@di.uoa.gr");
			user.setActivationId("Sdfsdfdsf");
			user.setPassword("dsfsdf");
			// user.setResourceId("3424234324234");
			// user.setResourceUri("dsfsdf");

			String xml = conv.ObjectToXml(user);

			System.out.println("saving profile: \n " + xml);

			ISRegistryService reg = (ISRegistryService) context
					.getBean("registryService");

			assertNotNull(reg);

			//String id = reg.registerProfile(xml);
			reg.registerProfile(xml);

			// System.out.println("Deleting profile");
			// reg.deleteProfile(id);
		} catch (ISRegistryServiceException e) {
			e.printStackTrace();
		} catch (JAXBException e) {
			e.printStackTrace();
		}
	}
	
	// @Test
	public void testLookUpWSClient() {
//		EndpointReferenceBuilder<Endpoint> builder = (EndpointReferenceBuilder<Endpoint>) context
//				.getBean("jaxwsEndpointReferenceBuilder");
//		Endpoint endpoint = (Endpoint) context.getBean("userProfileWebService");
//
//		assertNotNull(builder);
//		assertNotNull(endpoint);
//
//		W3CEndpointReference w3cepr = createW3CEpr(builder, endpoint);
//
//		w3cepr.writeTo(new StreamResult(System.out));

		// try {
		// assertNotNull(context);
		//
		// ISLookUpService service = (ISLookUpService) context
		// .getBean("lookUpService");
		//
		// assertNotNull(service);
		//
		// EPR epr = service
		// .searchProfile("for $x in collection(\"db/DRIVER\") return $x");
		//
		// System.out.println(epr.getEpr());
		//
		// ResultSet<String> rs = ResultSet.createNew(epr);
		//
		// System.out.println(rs.size());
		//
		// List<String> list = rs.get(1, rs.size());
		//
		// for (String s : list) {
		// System.out.println(s);
		// }
		//
		// } catch (ISLookUpServiceException e) {
		// e.printStackTrace();
		// }
	}

	@SuppressWarnings("unused")
	private W3CEndpointReference createW3CEpr(
			EndpointReferenceBuilder<Endpoint> builder, Endpoint endpoint) {
		W3CEndpointReference w3cepr = builder.getEndpointReference(endpoint);
		return w3cepr;
	}

}