/**
 * ÀÌ ¼Ò½º´Â Spring ÇÁ·¹ÀÓ¿öÅ© ¿öÅ©ºÏ¿¡¼­ »ç¿ëÇÑ ¿¹Á¦ ¼Ò½ºÀÔ´Ï´Ù. 
 * ÀÌ ¼Ò½º´Â ¸ðµç °³¹ßÀÚµéÀÌ ÀÚÀ¯·Ó°Ô ¼öÁ¤ ¹× ¹èÆ÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. 
 * ´Ü, ÀÌ ¼Ò½º¸¦ ±â¹ÝÀ¸·Î »õ·Î¿î ¾ÖÇÃ¸®ÄÉÀÌ¼ÇÀ» °³¹ßÇÒ °æ¿ì ÃâÃ³¸¦ ¸í½ÃÇØ ÁÖ½Ã¸é µË´Ï´Ù. 
 */
package net.javajigi.user.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.javajigi.user.ExistedUserException;
import net.javajigi.user.UserNotFoundException;
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.bind.RequestUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;

public class UserFormController extends SimpleFormController {
	private final Log logger = LogFactory.getLog(UserFormController.class);

	private UserService userService = null;

	public void setUserService(UserService userService) {
		this.userService = userService;
	}

	public UserFormController() {
		setCommandName("user");
		setCommandClass(User.class);
		setSessionForm(false);
		setBindOnNewForm(true);
	}

	public ModelAndView processFormSubmission(HttpServletRequest request,
			HttpServletResponse response, Object command, BindException errors)
			throws Exception {
		if (logger.isDebugEnabled()) {
			logger.debug("Remove param : " + request.getParameter("remove"));
			logger.debug("Add param : " + request.getParameter("add"));
			logger.debug("Modify param : " + request.getParameter("modify"));
			logger.debug("UserId : " + request.getParameter("userId"));
		}

		if (request.getParameter("remove") != null) {
			String userId = request.getParameter("userId");
			userService.removeUser(userId);

			return new ModelAndView(getSuccessView());
		}

		if (request.getParameter("add") != null) {
			request.setAttribute("mode", "add");
		} else if (request.getParameter("modify") != null) {
			request.setAttribute("mode", "modify");
		}

		return super.processFormSubmission(request, response, command, errors);
	}

	protected Object formBackingObject(HttpServletRequest request)
			throws ServletException {
		if (logger.isDebugEnabled()) {
			logger.debug("entering 'formBackingObject' method...");
		}
		String userId = request.getParameter("userId");
		if (logger.isDebugEnabled()) {
			logger.debug("received userId : " + userId);
		}

		if ((userId != null) && !userId.equals("")) {
			request.setAttribute("mode", "modify");

			User user = null;
			try {
				user = userService.findUser(userId);
			} catch (UserNotFoundException e) {
				e.printStackTrace();
			}

			if (user == null) {
				return new User();
			}

			return user;
		} else {
			return new User();
		}
	}

	public ModelAndView onSubmit(HttpServletRequest request,
			HttpServletResponse response, Object command, BindException errors)
			throws Exception {
		if (logger.isDebugEnabled()) {
			logger.debug("entering 'onSubmit' method...");
		}

		String userId = RequestUtils.getStringParameter(request, "userId");
		User user = (User) command;

		HttpSession session = request.getSession();
		if (request.getParameter("add") != null) {
			if (logger.isDebugEnabled()) {
				logger.debug("executing 'add User' method...");
			}

			try {
				userService.addUser(user);
			} catch (ExistedUserException e) {
				ModelAndView mav = new ModelAndView(getFormView());
				mav.addObject("user", user);
				mav.addObject("existedUserException", e);

				return mav;
			}

			if (session.getAttribute("loginUser") == null) {
				return new ModelAndView("redirect:/index.do");
			} else {
				User loginUser = (User) session.getAttribute("loginUser");
				
				if (loginUser.isAdmin()) {
					return new ModelAndView(getSuccessView());
				} else {
					return new ModelAndView("redirect:/index.do");
				}
			}
		} else {
			if (logger.isDebugEnabled()) {
				logger.debug("executing 'update User' method..." + userId);
			}
			userService.updateUser(user);

			if (session.getAttribute("loginUser") == null) {
				return new ModelAndView("redirect:/index.do");
			} else {
				User loginUser = (User) session.getAttribute("loginUser");
				
				if (loginUser.isAdmin()) {
					return new ModelAndView(getSuccessView());
				} else {
					return new ModelAndView("redirect:/index.do");
				}
			}
		}
	}
}
