/**
 * ÀÌ ¼Ò½º´Â Spring ÇÁ·¹ÀÓ¿öÅ© ¿öÅ©ºÏ¿¡¼­ »ç¿ëÇÑ ¿¹Á¦ ¼Ò½ºÀÔ´Ï´Ù. 
 * ÀÌ ¼Ò½º´Â ¸ðµç °³¹ßÀÚµéÀÌ ÀÚÀ¯·Ó°Ô ¼öÁ¤ ¹× ¹èÆ÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. 
 * ´Ü, ÀÌ ¼Ò½º¸¦ ±â¹ÝÀ¸·Î »õ·Î¿î ¾ÖÇÃ¸®ÄÉÀÌ¼ÇÀ» °³¹ßÇÒ °æ¿ì ÃâÃ³¸¦ ¸í½ÃÇØ ÁÖ½Ã¸é µË´Ï´Ù. 
 */
package net.javajigi.user.service;

import java.util.List;

import net.javajigi.common.mail.ExceptionMailSender;
import net.javajigi.user.ExistedUserException;
import net.javajigi.user.PasswordMismatchException;
import net.javajigi.user.UserNotFoundException;
import net.javajigi.user.dao.DataAccessException;
import net.javajigi.user.dao.UserDAO;
import net.javajigi.user.model.User;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;

public class UserServiceImpl implements UserService, InitializingBean {
	protected final Log logger = LogFactory.getLog(getClass());

	private UserDAO userDAO;

	private ExceptionMailSender mailSender;

	private ApplicationContext context;

	public void afterPropertiesSet() throws Exception {
		if (userDAO == null) {
			throw new Exception(context.getMessage("instance.not.init",
					new Object[] { "UserDAO" }, null));
		}

		if (mailSender == null) {
			throw new Exception(context.getMessage("instance.not.init",
					new Object[] { "ExceptionMailSender" }, null));
		}
	}

	public void setUserDAO(UserDAO newUserDAO) {
		this.userDAO = newUserDAO;
	}

	public void setMailSender(ExceptionMailSender mailSender) {
		this.mailSender = mailSender;
	}

	public void setApplicationContext(ApplicationContext context)
			throws BeansException {
		this.context = context;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.javajigi.user.spring.UserService#create(net.javajigi.user.model.User)
	 */
	public int addUser(User user) throws ExistedUserException {
		if (logger.isDebugEnabled()) {
			logger.debug("addUser() ½ÃÀÛ");
			logger.debug("User : " + user);
		}

		if (userDAO.existedUser(user.getUserId())) {
			throw new ExistedUserException(context.getMessage(
					"user.existed.exception",
					new Object[] { user.getUserId() }, null));
		}

		int result = 0;
		try {
			result = userDAO.insert(user);
		} catch (DataAccessException e) {
			mailSender.sendMessage(e);
			throw e;
		}

		if (logger.isDebugEnabled()) {
			logger.debug("Added " + user.getUserId() + " in User System!!");
		}

		if (logger.isDebugEnabled()) {
			logger.debug("addUser() Á¾·á");
		}

		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.javajigi.user.spring.UserService#update(net.javajigi.user.model.User)
	 */
	public int updateUser(User user) {
		if (logger.isDebugEnabled()) {
			logger.debug("updateUser() ½ÃÀÛ");
			logger.debug("User : " + user);
		}

		int result = 0;
		try {
			result = userDAO.update(user);
		} catch (DataAccessException e) {
			mailSender.sendMessage(e);
			throw e;
		}

		if (logger.isDebugEnabled()) {
			logger.debug("Updated " + user.getUserId() + " in User System!!");
		}

		if (logger.isDebugEnabled()) {
			logger.debug("updateUser() Á¾·á");
		}

		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.javajigi.user.spring.UserService#remove(java.lang.String)
	 */
	public int removeUser(String userId) {
		if (logger.isDebugEnabled()) {
			logger.debug("removeUser() ½ÃÀÛ");
			logger.debug("User ID : " + userId);
		}

		int result = 0;
		try {
			result = userDAO.delete(userId);
		} catch (DataAccessException e) {
			mailSender.sendMessage(e);
			throw e;
		}

		if (logger.isDebugEnabled()) {
			logger.debug("Removed " + userId + " in User System!!");
		}

		if (logger.isDebugEnabled()) {
			logger.debug("removeUser() Á¾·á");
		}

		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.javajigi.user.spring.UserService#findUser(java.lang.String)
	 */
	public User findUser(String userId) throws UserNotFoundException {
		if (logger.isDebugEnabled()) {
			logger.debug("findUser() ½ÃÀÛ");
			logger.debug("User ID : " + userId);
		}

		User user = null;

		try {
			user = userDAO.findUser(userId);
		} catch (DataAccessException e) {
			mailSender.sendMessage(e);
			throw e;
		}

		if (user == null) {
			throw new UserNotFoundException(context.getMessage(
					"user.notfound.exception", new Object[] { userId }, null));
		}

		if (logger.isDebugEnabled()) {
			logger.debug(userId + " »ç¿ëÀÚ Á¤º¸ : " + user);
		}

		if (logger.isDebugEnabled()) {
			logger.debug("findUser() Á¾·á");
		}

		return user;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.javajigi.user.spring.UserService#findUserList()
	 */
	public List findUserList() {
		if (logger.isDebugEnabled()) {
			logger.debug("findUserList() ½ÃÀÛ");
		}

		List userList = null;
		try {
			userList = userDAO.findUserList();
		} catch (DataAccessException e) {
			mailSender.sendMessage(e);
			throw e;
		}

		if (logger.isDebugEnabled()) {
			if (userList != null) {
				logger.debug("User System »ç¿ëÀÚ ¼ö : " + userList.size());
			} else {
				logger.debug("User System »ç¿ëÀÚ ¼ö : 0");
			}
		}

		if (logger.isDebugEnabled()) {
			logger.debug("findUserList() Á¾·á");
		}

		return userList;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.javajigi.user.spring.UserService#login(java.lang.String,
	 *      java.lang.String)
	 */
	public boolean login(String userId, String password)
			throws PasswordMismatchException, UserNotFoundException {
		if (logger.isDebugEnabled()) {
			logger.debug("login() ½ÃÀÛ");
			logger.debug("User Id : " + userId);
		}

		User user = findUser(userId);

		if (!user.isMatchPassword(password)) {
			throw new PasswordMismatchException(context.getMessage(
					"password.mismatch.exception", new Object[] { userId },
					null));
		}

		if (logger.isDebugEnabled()) {
			logger.debug("login() Á¾·á");
		}

		return true;
	}
}
