/**
 * ÀÌ ¼Ò½º´Â Spring ÇÁ·¹ÀÓ¿öÅ© ¿öÅ©ºÏ¿¡¼­ »ç¿ëÇÑ ¿¹Á¦ ¼Ò½ºÀÔ´Ï´Ù. 
 * ÀÌ ¼Ò½º´Â ¸ðµç °³¹ßÀÚµéÀÌ ÀÚÀ¯·Ó°Ô ¼öÁ¤ ¹× ¹èÆ÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. 
 * ´Ü, ÀÌ ¼Ò½º¸¦ ±â¹ÝÀ¸·Î »õ·Î¿î ¾ÖÇÃ¸®ÄÉÀÌ¼ÇÀ» °³¹ßÇÒ °æ¿ì ÃâÃ³¸¦ ¸í½ÃÇØ ÁÖ½Ã¸é µË´Ï´Ù. 
 */
package net.javajigi.user.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;

import javax.sql.DataSource;

import net.javajigi.common.dao.MyJdbcDaoSupport;
import net.javajigi.user.model.User;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.MappingSqlQuery;

public class MySQLUserDAO extends MyJdbcDaoSupport implements UserDAO {
	/*
	 * (non-Javadoc)
	 * 
	 * @see net.javajigi.user.dao.UserDAO#create(net.javajigi.user.model.User)
	 */
	public int insert(User newUser) throws DataAccessException {
		return getJdbcTemplate().update(
				getMessageSourceAccessor().getMessage("userinfo.insert"),
				new Object[] { newUser.getUserId(), newUser.getPassword(),
						newUser.getName(), newUser.getEmail(),
						new Boolean(newUser.isAdmin()) });
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.javajigi.user.dao.UserDAO#update(net.javajigi.user.model.User)
	 */
	public int update(User newUser) throws DataAccessException {
		return getJdbcTemplate().update(
				getMessageSourceAccessor().getMessage("userinfo.update"),
				new Object[] { newUser.getPassword(), newUser.getName(),
						newUser.getEmail(), new Boolean(newUser.isAdmin()),
						newUser.getUserId() });
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.javajigi.user.dao.UserDAO#remove(java.lang.String)
	 */
	public int delete(String userId) throws DataAccessException {
		return getJdbcTemplate().update(
				getMessageSourceAccessor().getMessage("userinfo.delete"),
				new Object[] { userId });
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.javajigi.user.dao.UserDAO#findUser(java.lang.String)
	 */
	public User findUser(String userId) throws DataAccessException {
		UserQuery query = new UserQuery(getDataSource(), getMessageSourceAccessor()
				.getMessage("userinfo.select.byuserid"));

		return (User) query.findObject(userId);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.javajigi.user.dao.UserDAO#findUserList()
	 */
	public List findUserList() throws DataAccessException {
		UsersQuery query = new UsersQuery(getDataSource(),
				getMessageSourceAccessor().getMessage("userinfo.select.list"));

		return query.execute();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.javajigi.user.dao.UserDAO#existedUser(java.lang.String)
	 */
	public boolean existedUser(String userId) throws DataAccessException {
		int result = getJdbcTemplate().queryForInt(
				getMessageSourceAccessor().getMessage("userinfo.select.count"),
				new Object[] { userId });

		if (result == 1) {
			return true;
		} else {
			return false;
		}
	}

	protected class UserQuery extends MappingSqlQuery {
		protected UserQuery(DataSource ds, String findQuery) {
			super(ds, findQuery);
			declareParameter(new SqlParameter(Types.VARCHAR));
		}

		protected Object mapRow(ResultSet rs, int rownum) throws SQLException {
			User user = new User();
			user.setUserId(rs.getString("userId"));
			user.setPassword(rs.getString("password"));
			user.setName(rs.getString("name"));
			user.setEmail(rs.getString("email"));
			user.setAdmin(rs.getBoolean("adminYN"));

			return user;
		}
	}

	protected class UsersQuery extends MappingSqlQuery {
		protected UsersQuery(DataSource ds, String sql) {
			super(ds, sql);
		}

		protected Object mapRow(ResultSet rs, int rownum) throws SQLException {
			User user = new User();
			user.setUserId(rs.getString("userId"));
			user.setName(rs.getString("name"));
			user.setEmail(rs.getString("email"));
			user.setAdmin(rs.getBoolean("adminYN"));

			return user;
		}
	}
}
