package eu.dnetlib.enabling.ui;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.collections.ExtendedProperties;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.context.Context;
import org.apache.velocity.tools.view.servlet.VelocityViewServlet;
import org.springframework.beans.factory.annotation.Required;

import eu.dnetlib.enabling.ui.server.SessionManager;

/**
 * Main Servlet.
 *
 * @author michele
 *
 */
public class MainServlet extends VelocityViewServlet {

	/**
	 * serializable
	 */
	private static final long serialVersionUID = 2751728218621288364L;
	
	/**
	 * GWT module
	 */
	private String gwtModule;
	
	/**
	 * Google Map Key
	 */
	private String googleMapKey;
	
	/**
	 * Page title
	 */
	private String title;
	
	/**
	 * URL linked by logo img
	 */
	private String logoHref;
	/**
	 * logo img
	 */
	private String logoImg;
	

	
	/**
	 * singleton instance.
	 */
	private static MainServlet instance = null;
	
	/**
	 * Session Manager
	 */
	private SessionManager sessionManager;
	
	/**
	 * velocity properties.
	 */
	private final ExtendedProperties velocityProperties;


	/**
	 * Creates the singleton instance.
	 *
	 * @throws ServletException
	 *             could happen
	 */
	private MainServlet() throws ServletException {
		super();
		velocityProperties = new ExtendedProperties();
		velocityProperties.setProperty(Velocity.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.NullLogSystem");
		velocityProperties.setProperty(Velocity.RESOURCE_LOADER, "class");
		velocityProperties.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
		init();
	}
	/**
	 * Obtains the singleton instance and lazily instantiates the oai servlet.
	 *
	 * @return oai servlet
	 * @throws ServletException
	 *             could happen
	 */
	public static MainServlet getInstance() throws ServletException {
		if (instance == null)
			instance = new MainServlet();
		return instance;
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.apache.velocity.tools.view.servlet.VelocityViewServlet#loadConfiguration(javax.servlet.ServletConfig)
	 */
	@Override
	protected ExtendedProperties loadConfiguration(final ServletConfig config) {
		return velocityProperties;
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.apache.velocity.tools.view.servlet.VelocityViewServlet#setContentType(javax.servlet.http.HttpServletRequest,
	 *      javax.servlet.http.HttpServletResponse)
	 */
	@Override
	protected void setContentType(final HttpServletRequest request, final HttpServletResponse response) {
		response.setContentType("text/html; charset=utf-8");
	}

	/**
	 * Get a template for velocity.
	 *
	 * @param filename
	 *            template filename
	 * @return velocity template
	 * @throws Exception
	 *             could happen
	 */
	public Template myGetTemplate(final String filename) throws Exception {
		final String dir = this.getClass().getPackage().getName().replaceAll("\\.", "/");
		return getVelocityEngine().getTemplate(dir + "/velocity/" + filename);
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.apache.velocity.tools.view.servlet.VelocityViewServlet#handleRequest(javax.servlet.http.HttpServletRequest,
	 *      javax.servlet.http.HttpServletResponse, org.apache.velocity.context.Context)
	 */
	public Template handleRequest(final HttpServletRequest request, final HttpServletResponse response, final Context context) throws Exception {
		String base = (request.getContextPath().split("\\/"))[1];
		
		
		String sessionId = "";
		Cookie[] cookies = request.getCookies();
		if (cookies != null) {
			for (Cookie c : cookies) {
				if (c.getName().equals("session")) {
					sessionId =  c.getValue();
				}
			}
		}
		
		String basedir = "/" + base + "/" + gwtModule;
		context.put("LOGOHREF", logoHref);
		if (logoImg.startsWith("http://")) {
			context.put("LOGOIMG", logoImg);
		} else {
			context.put("LOGOIMG", basedir + "/img/" + logoImg) ;
		}
		context.put("TITLE", title);
		context.put("BASEDIR", basedir);
		
		if ((sessionId == "")||(sessionManager.isValidSession(sessionId))) {
			context.put("DRIVERAPPCONTEXT", "/" + base);
			context.put("GOOGLEMAPKEY" , googleMapKey);
			context.put("GWTJS", gwtModule + ".nocache.js");
			return myGetTemplate("GWTMain.html.vm");
		} 

		return myGetTemplate("sessionexpired.html.vm");
	}
	
	
	public String getGwtModule() {
		return gwtModule;
	}
	
	@Required
	public void setGwtModule(String gwtModule) {
		this.gwtModule = gwtModule;
	}
	
	public String getGoogleMapKey() {
		return googleMapKey;
	}
	
	@Required
	public void setGoogleMapKey(String googleMapKey) {
		this.googleMapKey = googleMapKey;
	}
	
	public String getTitle() {
		return title;
	}
	
	@Required
	public void setTitle(String title) {
		this.title = title;
	}
	
	public String getLogoHref() {
		return logoHref;
	}

	@Required
	public void setLogoHref(String logoHref) {
		this.logoHref = logoHref;
	}
	
	public String getLogoImg() {
		return logoImg;
	}

	@Required
	public void setLogoImg(String logoImg) {
		this.logoImg = logoImg;
	}
	
	public SessionManager getSessionManager() {
		return sessionManager;
	}
	
	@Required
	public void setSessionManager(SessionManager sessionManager) {
		this.sessionManager = sessionManager;
	}

}
