package eu.dnetlib.enabling.ui.server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringReader;

import javax.annotation.Resource;
import javax.servlet.ServletResponse;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;

import org.dom4j.Document;
import org.dom4j.io.DocumentResult;
import org.dom4j.io.DocumentSource;
import org.dom4j.io.SAXReader;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
import eu.dnetlib.enabling.tools.ServiceLocator;


@Controller
public class ProfileViewer {

	@Resource(name = "lookupLocator")
	private ServiceLocator<ISLookUpService> isLookUpLocator;

	@RequestMapping(value = "/userinterface/profile.do")
	public void getProfile(final ServletResponse response, @RequestParam(value = "id", required = true) final String id, @RequestParam(value = "style", required = false) final String style, final OutputStream out) throws IOException {
		String textToSend = "";

		try {
			String prof = isLookUpLocator.getService().getResourceProfile(id);

			if (style != null) {
				response.setContentType("text/html");
				InputStream stream = getClass().getResourceAsStream(style + ".xslt");
				if (stream != null) {
					try {
						SAXReader reader = new SAXReader();
						TransformerFactory factory = TransformerFactory.newInstance();
						Document documentXSLT = reader.read(stream);
						DocumentSource sourceXSLT = new DocumentSource(documentXSLT);
						Transformer transformer = factory.newTransformer(sourceXSLT);

						Document document = reader.read(new StringReader(prof));
						DocumentSource source = new DocumentSource(document);
						DocumentResult result = new DocumentResult();
						transformer.transform(source, result);

						textToSend = result.getDocument().asXML();
					} catch (Exception e) {
						textToSend = "Error applying stylesheet: " + e.getMessage();
					}

				}
			} else {
				response.setContentType("application/xml");
				textToSend = prof;
			}

		} catch (Exception e) {
			textToSend = e.getMessage();
		}
		out.write(textToSend.getBytes());
		out.flush();
		out.close();
	}

	@RequestMapping(value = "/userinterface/schema.do")
	public void getProfile(final ServletResponse response, @RequestParam(value = "name", required = true) final String name, final OutputStream out) throws IOException {

		String textToSend;

		try {

			textToSend = isLookUpLocator.getService().getResourceTypeSchema(name);
			response.setContentType("application/xml");
		} catch (Exception e) {
			textToSend = e.getMessage();
			response.setContentType("text/html");
		}
		out.write(textToSend.getBytes());
		out.flush();
		out.close();
	}

	public ServiceLocator<ISLookUpService> getIsLookUpLocator() {
		return isLookUpLocator;
	}

	public void setIsLookUpLocator(ServiceLocator<ISLookUpService> isLookUpLocator) {
		this.isLookUpLocator = isLookUpLocator;
	}
}
