/**
 * ÀÌ ¼Ò½º´Â Spring ÇÁ·¹ÀÓ¿öÅ© ¿öÅ©ºÏ¿¡¼­ »ç¿ëÇÑ ¿¹Á¦ ¼Ò½ºÀÔ´Ï´Ù. 
 * ÀÌ ¼Ò½º´Â ¸ðµç °³¹ßÀÚµéÀÌ ÀÚÀ¯·Ó°Ô ¼öÁ¤ ¹× ¹èÆ÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. 
 * ´Ü, ÀÌ ¼Ò½º¸¦ ±â¹ÝÀ¸·Î »õ·Î¿î ¾ÖÇÃ¸®ÄÉÀÌ¼ÇÀ» °³¹ßÇÒ °æ¿ì ÃâÃ³¸¦ ¸í½ÃÇØ ÁÖ½Ã¸é µË´Ï´Ù. 
 */
package net.javajigi.user.web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.javajigi.user.PasswordMismatchException;
import net.javajigi.user.UserNotFoundException;
import net.javajigi.user.model.Authenticate;
import net.javajigi.user.model.User;
import net.javajigi.user.service.UserService;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;

/**
 * ÁÖ¼®À» ³Ö¾î ÁÖ¼¼¿ä. ¹è°¡ °íÆÄ¿ä.
 * 
 * @author ¹ÚÀç¼º(ÀÚ¹ÙÁö±â, javajigi@gmail.com)
 */
public class LoginFormController extends SimpleFormController {
	private final Log logger = LogFactory.getLog(LoginFormController.class);

	private UserService userService = null;

	public void setUserService(UserService userService) {
		this.userService = userService;
	}

	public LoginFormController() {
		setCommandName("authenticate");
		setCommandClass(Authenticate.class);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.springframework.web.servlet.mvc.SimpleFormController#processFormSubmission(javax.servlet.http.HttpServletRequest,
	 *      javax.servlet.http.HttpServletResponse, java.lang.Object,
	 *      org.springframework.validation.BindException)
	 */
	protected ModelAndView processFormSubmission(HttpServletRequest request,
			HttpServletResponse response, Object command, BindException ex)
			throws Exception {
		if (logger.isDebugEnabled()) {
			logger.debug("entering 'processFormSubmission' method...");
		}

		return super.processFormSubmission(request, response, command, ex);
	}

	public ModelAndView onSubmit(HttpServletRequest request,
			HttpServletResponse response, Object command, BindException errors)
			throws Exception {
		if (logger.isDebugEnabled()) {
			logger.debug("entering 'onSubmit' method...");
		}

		if (request.getParameter("login") != null) {
			Authenticate auth = (Authenticate) command;
			
			try {
				userService.login(auth.getUserId(), auth.getPassword());
				
				User user = userService.findUser(auth.getUserId());
				user.setPassword(null);
				HttpSession session = request.getSession();
				session.setAttribute("loginUser", user);
				
				return new ModelAndView(getSuccessView());
			} catch (UserNotFoundException e) {
				request.setAttribute("errorMessage", e.getMessage());
				
				return new ModelAndView(getFormView());
			} catch (PasswordMismatchException e) {
				request.setAttribute("errorMessage", e.getMessage());
				
				return new ModelAndView(getFormView());
			}
		} else {
			HttpSession session = request.getSession();

			if (session.getAttribute("loginUser") != null) {
				return new ModelAndView("/decorators/logout");
			} else {
				return new ModelAndView("/decorators/login");
			}
		}
	}

	protected ModelAndView showForm(HttpServletRequest request,
			HttpServletResponse response, BindException ex) throws Exception {
		if (logger.isDebugEnabled()) {
			logger.debug("entering 'showForm' method...");
		}

		if (request.getParameter("logout") != null) {
			HttpSession session = request.getSession();
			session.removeAttribute("loginUser");

			return new ModelAndView(getSuccessView());
		} else {
			HttpSession session = request.getSession();

			if (session.getAttribute("loginUser") != null) {
				return new ModelAndView("/decorators/logout");
			}
		}

		return super.showForm(request, response, ex);
	}
}
