/**
 * ÀÌ ¼Ò½º´Â 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.UserNotFoundException;
import net.javajigi.user.model.User;
import net.javajigi.user.service.UserService;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.actions.DispatchAction;

public class UserAction extends DispatchAction {
	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger.getLogger(UserAction.class);

	private UserService userService = null;

	public void setUserService(UserService userService) {
		this.userService = userService;
	}

	public ActionForward list(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		if (logger.isDebugEnabled()) {
			logger.debug("List User...");
		}

		request.setAttribute("userList", userService.findUserList());

		return mapping.findForward("list");
	}

	public ActionForward add(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		if (log.isDebugEnabled()) {
			log.debug("Add User...");
		}

		DynaActionForm userForm = (DynaActionForm) form;
		userService.addUser((User) userForm.get("user"));

		return dispatchView(mapping, form, request, response);
	}

	private ActionForward dispatchView(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		HttpSession session = request.getSession();
		if (session.getAttribute("loginUser") == null) {
			return mapping.findForward("index");
		} else {
			User loginUser = (User) session.getAttribute("loginUser");

			if (loginUser.isAdmin()) {
				return list(mapping, form, request, response);
			} else {
				return mapping.findForward("index");
			}
		}
	}

	public ActionForward editForm(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		findUser(request);

		return mapping.findForward("edit");
	}

	private void findUser(HttpServletRequest request)
			throws UserNotFoundException {
		if (log.isDebugEnabled()) {
			log.debug("Finding User...");
		}

		String userId = request.getParameter("userId");

		if (userId != null) {
			request.setAttribute("mode", "modify");
			request.setAttribute("user", userService.findUser(userId));
		} else {
			request.setAttribute("mode", "add");
			request.setAttribute("user", new User());
		}
	}

	public ActionForward modify(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		if (log.isDebugEnabled()) {
			log.debug("Modifying User...");
		}

		DynaActionForm userForm = (DynaActionForm) form;
		userService.updateUser((User) userForm.get("user"));

		return dispatchView(mapping, form, request, response);
	}

	public ActionForward view(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		findUser(request);

		return mapping.findForward("view");
	}

	public ActionForward delete(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		if (log.isDebugEnabled()) {
			log.debug("Deleting User...");
		}

		String userId = request.getParameter("userId");

		if (userId != null) {
			userService.removeUser(userId);
		}

		return list(mapping, form, request, response);
	}
}
