package org.kepler.web.service;

import com.google.gwt.user.client.rpc.*;
import com.google.gwt.user.server.rpc.*;

import org.kepler.web.client.*;

import edu.ucsb.nceas.metacat.client.*;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.apache.xpath.XPathAPI;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.xml.sax.InputSource;

import java.io.*;
import java.util.*;

public class KeplerServiceServlet extends RemoteServiceServlet implements KeplerService
{
  private String url = "http://library.kepler-project.org/kepler/metacat";
  
  /**
   * takes in a query string and a sessionid and returns a resultset
   */
  public MetacatQueryResult[] query(String query, String sessionid)
  {
    try
    { //query metacat
      MetacatClient client = (MetacatClient)MetacatFactory.createMetacatConnection(url);
      String queryDoc = createQueryDocument(query);
      Reader queryResultReader = client.query(new StringReader(queryDoc));
      //now we have the result document, parse it and return it as MQR[]
      InputSource is = new InputSource(queryResultReader);
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document doc = builder.parse(is);
      NodeList docs = XPathAPI.selectNodeList(doc, "/resultset/document");
      MetacatQueryResult[] mqr = new MetacatQueryResult[docs.getLength()];
      for(int i=0; i<docs.getLength(); i++)
      {
        Node docNode = docs.item(i);
        //parse each document result into an MQR
        mqr[i] = new MetacatQueryResult();
        String docid = XPathAPI.selectSingleNode(docNode, "docid").getFirstChild().getNodeValue();
        String name = XPathAPI.selectSingleNode(docNode, "param[@name='/entity/@name']").getFirstChild().getNodeValue();
        
        mqr[i].setDocid(docid);
        mqr[i].setName(name);
        mqr[i].setDescription("");
      }
      
      return mqr;
    }
    catch(Exception e)
    {
      return null;
    }
  }
  
  /**
   * takes in credentials and returns a sessionid
   */
  public String login(String user, String pass)
  {
    try
    {
      MetacatClient client = (MetacatClient)MetacatFactory.createMetacatConnection(url);
      return client.login("uid=kepler,o=unaffiliated,dc=ecoinformatics,dc=org", "kepler");
    }
    catch(Exception e)
    {
      return "error: " + e.getMessage();
    }
  }
  
  public String logout()
  {
    return "logout";
  }
  
  /**
   * takes in a docid and a sessionid and returns a document
   */
  public String read(String docid, String sessionid)
  {
    return "read";
  }
  
  private String createQueryDocument(String queryString)
  {
    String query = "<?xml version=\"1.0\"?>" +
      "<pathquery version=\"1.2\">" +
      "<querytitle>Untitled-Search-1</querytitle>" +
      "<returndoctype>entity</returndoctype>" +
      "<returndoctype>eml://ecoinformatics.org//eml-2.0.0</returndoctype>" +
      "<returndoctype>-//ecoinformatics.org//eml-dataset-2.0.0beta4//EN</returndoctype>" +
      "<returndoctype>-//ecoinformatics.org//eml-dataset-2.0.0beta6//EN</returndoctype>" +
      "<returndoctype>-//NCEAS//eml-dataset-2.0//EN</returndoctype>" +
      "<returndoctype>-//NCEAS//resource//EN</returndoctype>" +
      "<returnfield>/entity/@name</returnfield>" +
      "<querygroup operator=\"INTERSECT\">" +
        "<querygroup operator=\"UNION\">" +
            "<queryterm searchmode=\"contains\" casesensitive=\"false\">" +
              "<value>" + queryString + "</value>" +
            "</queryterm>" +
        "</querygroup>" +
      "</querygroup>" +
      "</pathquery>";
    return query;
  }
}