package eu.dnetlib.functionality.modular.ui;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.ui.ModelMap;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public abstract class ModuleEntryPoint extends MenuEntry implements Controller, BeanNameAware {
	
	private String beanName;
	
	private boolean validMenuEntry = true;
	
	private String group;
	private int groupOrder = 50;
	
	
	@Resource
	protected EntryPointsAggregator aggregator;
	
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mv = new ModelAndView();
		ModelMap map = mv.getModelMap();
		map.addAttribute("menu", getMenu());
		map.addAttribute("title", getTitle());
		map.addAttribute("description", getDescription());
		map.addAttribute("group", getGroup());
		map.addAttribute("modules", aggregator.getMenus());

		String baseUrl = "";
		for (int i=1; i < StringUtils.countMatches(beanName, "/"); i++) {
			baseUrl += "/..";
		}
		if (baseUrl.length() > 0) {
			baseUrl = baseUrl.substring(1);
		}
		
		map.addAttribute("baseUrl", baseUrl);
		
		initialize(map, request, response);
		return mv;
	}
	
	abstract protected void initialize(ModelMap map, HttpServletRequest request, HttpServletResponse response) throws Exception;
	
	public String getBeanName() {
		return beanName;
	}
	
	@Override
	public void setBeanName(String beanName) {
		this.beanName = beanName;
	}
	
	public String getGroup() {
		return group;
	}
	@Required
	public void setGroup(String group) {
		this.group = group;
	}
	
	@Override
	public String getRelativeUrl() {
		return beanName;
	}

	public boolean isValidMenuEntry() {
		return validMenuEntry;
	}

	public void setValidMenuEntry(boolean validMenuEntry) {
		this.validMenuEntry = validMenuEntry;
	}

	public int getGroupOrder() {
		return groupOrder;
	}

	public void setGroupOrder(int groupOrder) {
		this.groupOrder = groupOrder;
	}
	
}
