/**
 * ÀÌ ¼Ò½º´Â Spring ÇÁ·¹ÀÓ¿öÅ© ¿öÅ©ºÏ¿¡¼­ »ç¿ëÇÑ ¿¹Á¦ ¼Ò½ºÀÔ´Ï´Ù. 
 * ÀÌ ¼Ò½º´Â ¸ðµç °³¹ßÀÚµéÀÌ ÀÚÀ¯·Ó°Ô ¼öÁ¤ ¹× ¹èÆ÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. 
 * ´Ü, ÀÌ ¼Ò½º¸¦ ±â¹ÝÀ¸·Î »õ·Î¿î ¾ÖÇÃ¸®ÄÉÀÌ¼ÇÀ» °³¹ßÇÒ °æ¿ì ÃâÃ³¸¦ ¸í½ÃÇØ ÁÖ½Ã¸é µË´Ï´Ù. 
 */
package net.javajigi.board.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import net.javajigi.board.model.Board;
import net.javajigi.common.dao.MyJdbcDaoSupport;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;

public class SpringJDBCWithTemplateBoardDAO extends MyJdbcDaoSupport implements
		BoardDAO {

	public Board insert(Board board) throws DataAccessException {
		String sql = getMessageSourceAccessor().getMessage("board.sql.insert");
		int boardNo = getIncrementer().nextIntValue();
		board.setBoardNo(boardNo);
		Object[] values = { new Integer(boardNo), board.getTitle(),
				board.getName(), board.getEmail(), board.getPassword(),
				board.getCreateDate(), board.getContent() };

		getJdbcTemplate().update(sql, values);

		return board;
	}

	public Board update(Board board) throws DataAccessException {
		String sql = getMessageSourceAccessor().getMessage("board.sql.update");
		Object[] values = { board.getTitle(), board.getName(),
				board.getEmail(), board.getContent(),
				new Integer(board.getBoardNo()) };
		getJdbcTemplate().update(sql, values);

		return board;
	}

	public int delete(int boardNo) throws DataAccessException {
		String sql = getMessageSourceAccessor().getMessage("board.sql.delete");

		return getJdbcTemplate().update(sql,
				new Object[] { new Integer(boardNo) });
	}

	public Board findBoard(int boardNo) throws DataAccessException {
		String sql = getMessageSourceAccessor().getMessage(
				"board.sql.select.byboardno");

		RowMapper rowMapper = new RowMapper() {
			public Object mapRow(ResultSet rs, int rownum) throws SQLException {
				Board board = new Board();
				board.setTitle(rs.getString("title"));
				board.setName(rs.getString("name"));
				board.setEmail(rs.getString("email"));
				board.setPassword(rs.getString("password"));
				board.setCreateDate(rs.getString("createdate"));
				board.setContent(rs.getString("content"));
				board.setHitCount(rs.getInt("hitCount"));

				return board;
			}
		};

		Board board = (Board) getJdbcTemplate().queryForObject(sql,
				new Object[] { new Integer(boardNo) }, rowMapper);
		board.setBoardNo(boardNo);

		return board;
	}

	public List findBoardList(int currentPage, int countPerPage)
			throws DataAccessException {
		int start = (currentPage - 1) * countPerPage;

		String sql = getMessageSourceAccessor().getMessage(
				"board.sql.select.list");

		RowMapper rowMapper = new RowMapper() {
			public Object mapRow(ResultSet rs, int rownum) throws SQLException {
				Board board = new Board();
				board.setBoardNo(rs.getInt("boardNo"));
				board.setTitle(rs.getString("title"));
				board.setName(rs.getString("name"));
				board.setEmail(rs.getString("email"));
				board.setCreateDate(rs.getString("createdate"));
				board.setHitCount(rs.getInt("hitCount"));

				return board;
			}
		};

		List list = getJdbcTemplate().query(sql,
				new Object[] { new Integer(start), new Integer(countPerPage) },
				rowMapper);

		return list;
	}

	public int updateHitCount(int boardNo) throws DataAccessException {
		String sql = getMessageSourceAccessor().getMessage(
				"board.sql.update.hitcount");

		return getJdbcTemplate().update(sql,
				new Object[] { new Integer(boardNo) });
	}

	public int getTotalNo() throws DataAccessException {
		String sql = getMessageSourceAccessor().getMessage(
				"board.sql.totalcount");
		return getJdbcTemplate().queryForInt(sql);
	}
}
