package com.k_int.npdb.action.venue;

import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.xpath.CachedXPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.k_int.npdb.datamodel.Address;
import com.k_int.npdb.datamodel.Venue;
import com.k_int.npdb.util.SOLRUtils;
import com.k_int.npdb.util.XMLUtils;
import com.opensymphony.xwork2.Action;


public class VenueSearchAction{
	
		private String title;
		private String location;
		private String solrURL;
		private String query;
		private int rows = 10;
		private int start;
		
		private int count;
		private List<Venue> venues = new ArrayList<Venue>();
		
		
		
		private static Log log = LogFactory.getLog(VenueSearchAction.class);
		
		public void setTitle(String title) {
			this.title = title;
		}
		
	
		public int getStart() {
			return start;
		}

		public String getTitle() {
			log.debug("getting title " + title);
			return title;
		}

		public void setStart(int start) {
			this.start = start;
		}
		
		public void setSolrURL(String solrURL) {
			this.solrURL = solrURL;
		}

		
		
		public String getLocation() {
			return location;
		}

		public void setLocation(String location) {
			this.location = location;
		}

		public List<Venue> getVenues() {
			return venues;
		}

	
		public int getCount() {
			return count;
		}
		
		public String getQuery() {
			log.debug("getting query " + query);
			return query;
		}

        
		
		public int getRows() {
			return rows;
		}


		public void setRows(int rows) {
			this.rows = rows;
		}


		public String execute(){
			try{
				String titleQ = (title!=null && !"".equals(title))?" AND name:" + title : " AND name:[* TO *]";
				String locationQ = (location!=null && !"".equals(location))?" AND location:" + location :"";
			    query = titleQ + locationQ;
			    
				Document d = SOLRUtils.search(solrURL + "/select/?q=type:venue"+ URLEncoder.encode(query,"UTF-8") +"&version=2.2&start=" + start +"&rows="+ rows );
				log.debug("query " +"/select/?q=type:venue"+query +"&version=2.2&start=" + start +"&rows="+ rows );
				if (d != null) {
		    		processResponse(d);
				}
		    }
		    catch (Exception e)
		    {
		    	e.printStackTrace();
		    }
			return Action.SUCCESS;
		}
		
		private void processResponse(Document d)
		{
			try{
			CachedXPathAPI api = new CachedXPathAPI();
			Element solrResultElement = (Element) api.selectSingleNode(d,
					"/response/result");
			count = Integer.parseInt(solrResultElement
					.getAttribute("numFound"));
			NodeList elements =  api.selectNodeList(d,"/response/result/doc");
			venues = new ArrayList<Venue>();
			for (int i = 0; i < elements.getLength(); i++)
			{
				Node n = elements.item(i);
				Venue v = new Venue();
				v.setName(XMLUtils.getString(n, "str[@name='name']"));
				Address address = new Address();
				address.setTown(XMLUtils.getString(n, "str[@name='location']"));
				v.setAddress(address);
				String internalId = XMLUtils.getString(n, "long[@name='internalId']");
				if (internalId!=null)
					v.setId(Long.valueOf(internalId));
				log.debug("town " + v.getAddress().getTown());
				venues.add(v);
			}
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
		
	}