package at.gv.egiz.pdfas.utils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
import at.knowcenter.wag.egov.egiz.exceptions.SettingNotFoundException;
import at.knowcenter.wag.egov.egiz.exceptions.SettingsException;
import at.knowcenter.wag.egov.egiz.web.LocalRequestHelper;

/**
 * @author tknall
 */
public final class WebUtils {

   private WebUtils() {
   }

   /**
    * The log.
    */
   private final static Log LOG = LogFactory.getLog(WebUtils.class);
   
   /**
    * The configuration key that replaces a dynamically generated retrieve signature data url.
    */
   private final static String RETRIEVE_SIGNATURE_DATA_URL_OVERRIDE_KEY = "retrieve_signature_data_url_override";
   
   /**
    * Unlike {@link HttpServletResponse#encodeURL(String)} that adds only a
    * {@code JSESSIONID} entry to the given url if needed, this method always
    * adds the session id (except if already present within the url.
    * 
    * @param url
    *           The given url.
    * @param session
    *           The {@link HttpSession}.
    * @return The given url plus a session id.
    */
   public static String addJSessionID(String url, HttpSession session) {
      if (url == null) {
         return null;
      }
      if (!StringUtils.containsIgnoreCase(url, ";jsessionid=")) {
         url = url + ";jsessionid=" + session.getId();
         LOG.debug("Adding jsessionid " + session.getId());
      } else {
         LOG.debug("No need to add a jsessionid.");
      }
      LOG.debug("Returning url " + url);
      return url;
   }

   /**
    * Unlike {@link HttpServletResponse#encodeURL(String)} that adds only a
    * {@code JSESSIONID} entry to the given url if needed, this method always
    * adds the session id (except if already present within the url.
    * 
    * @param url
    *           The given url.
    * @param request
    *           The {@link HttpServletRequest}.
    * @return The given url plus a session id.
    */
   public static String addJSessionID(String url, HttpServletRequest request) {
      return addJSessionID(url, request.getSession());
   }
   
   /**
    * Either dynamically creates locref content url or uses a url provides by the pdf-as
    * configuration (key {@code retrieve_signature_data_url_override}).
    * @param request The {@link HttpServletRequest}.
    * @param response The {@link HttpServletResponse}.
    * @return The retrieve signature data url.
    */
   public static String buildRetrieveSignatureDataURL(HttpServletRequest request, HttpServletResponse response) {
      String override = null;
      LOG.debug("Building retrieve signature data url.");
      try {
         override = SettingsReader.getInstance().getSetting(RETRIEVE_SIGNATURE_DATA_URL_OVERRIDE_KEY, null);
      } catch (SettingsException e) {
         LOG.error(e);
      }
      String result;
      if (override == null) {
         result = WebUtils.addJSessionID(LocalRequestHelper.getLocalContextAddress(request, response) + "/RetrieveSignatureData", request);         
      } else {
         LOG.debug("Override url found: " + override);
         result = WebUtils.addJSessionID(override, request);         
      }
      LOG.debug("RetrieveSignatureDataURL = " + result);
      return result;
   }

}