package eu.dnetlib.administration.uis;

import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import eu.dnetlib.administration.uis.auth.AuthorizationManager;
import eu.dnetlib.administration.uis.auth.User;
import eu.dnetlib.administration.uis.modules.ErrorMessage;
import eu.dnetlib.administration.uis.modules.UIModule;
import eu.dnetlib.administration.uis.modules.UIModuleGrouper;

@Controller
public class UIController {

	@Autowired
	private UIModuleGrouper grouper;

	@Autowired
	private AuthorizationManager authorizationManager;

	@Autowired
	private UIProperties properties;

	@RequestMapping({ "/", "/ui" })
	public String root() {
		return "redirect:/ui/home";
	}

	@RequestMapping("/ui/{section}")
	public String section(final ModelMap map,
			final HttpServletRequest request,
			@PathVariable("section") final String section) throws Exception {
		final User user = authorizationManager.obtainUserDetails(request);

		final UIModule module = grouper.getModuleByUrlSection(section);

		if (module == null) {
			return "redirect:home";
		} else if (user == null) {
			final StringBuffer url = request.getRequestURL();
			final String queryString = request.getQueryString();
			if (queryString != null) {
				url.append('?');
				url.append(queryString);
			}
			return "redirect:" + properties.getAuthenticationUrl() + "?url=" + URLEncoder.encode(url.toString(), "UTF-8");
		} else {

			map.addAttribute("section", section);
			map.addAttribute("uiTitle", module.getTitle());
			map.addAttribute("uiGroup", module.getGroup());
			map.addAttribute("uiUser", user);
			map.addAttribute("uiMenus", grouper.getMenus(user));
			map.addAttribute("environment", properties.getRibbonEnv());
			map.addAttribute("ribbonAccent", properties.getRibbonAccent());

			module.populateModelMap(map, request);

			return "master";
		}
	}

	@RequestMapping("logout")
	public String logout() {
		// TODO
		return "";
	}

	@ExceptionHandler(Throwable.class)
	@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
	public @ResponseBody ErrorMessage handleException(final Exception e) {
		return ErrorMessage.newInstance(e);
	}
}
