package com.k_int.srusolr.action;

import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import com.opensymphony.xwork2.ActionSupport;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;

public abstract class BaseSearchAction extends ActionSupport implements ServletRequestAware {
  private static final long serialVersionUID = 1L;
  protected HttpServletRequest request;
  private Map<String, String> params = new HashMap<String, String>();
  protected String query;
  private String landscape;
  
  public String getSruUrl() {
    StringBuilder sb = new StringBuilder(landscape);
    sb.append("?");
    
    Iterator<Entry<String, String>> param_it = params.entrySet().iterator();
    while (param_it.hasNext()) {
      Entry<String, String> param = param_it.next();
      sb.append(param.getKey());
      sb.append("=");
      sb.append(param.getValue());
    
      if (param_it.hasNext()) sb.append("&"); 
    }
    
    return sb.toString();
  }

  
  public void setServletRequest(HttpServletRequest request) {
    this.request = request;
  } 
  
  
  protected String getOrDefault(String param, String default_value) {
    String ret = request.getParameter(param);
    return (ret!=null && !ret.trim().equals("")) ? ret : default_value;
  }

  
  public String execute() throws Exception {
    String result = ERROR;  
    String submit = request.getParameter("submit");
  
    if (submit!=null && !submit.trim().equals("")) {
      landscape = getOrDefault("landscape", "default");

      addOrDrop("version", "1.1");
      addOrDrop("operation", "searchRetrieve");
      addOrDrop("startRecord", "1");
      addOrDrop("maximumRecords", "10");
      addOrDrop("stylesheet", null);
      
      // special case - needs to be dealt with in extending classes and escaped. 
      query = getOrDefault("query", null);
    
      result = internalExecute();
      
      if (query!=null) {
        params.put("query", URLEncoder.encode(query, "UTF-8"));
      }
    }
    
    return result;
  }
  
  
  private void addOrDrop(String key, String default_value) {
    String value = getOrDefault(key, default_value);
    if (value!=null) {
      params.put(key, value);
    }
  }

  
  protected abstract String internalExecute() throws Exception;
}