/**
 * ÀÌ ¼Ò½º´Â Spring ÇÁ·¹ÀÓ¿öÅ© ¿öÅ©ºÏ¿¡¼­ »ç¿ëÇÑ ¿¹Á¦ ¼Ò½ºÀÔ´Ï´Ù. 
 * ÀÌ ¼Ò½º´Â ¸ðµç °³¹ßÀÚµéÀÌ ÀÚÀ¯·Ó°Ô ¼öÁ¤ ¹× ¹èÆ÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. 
 * ´Ü, ÀÌ ¼Ò½º¸¦ ±â¹ÝÀ¸·Î »õ·Î¿î ¾ÖÇÃ¸®ÄÉÀÌ¼ÇÀ» °³¹ßÇÒ °æ¿ì ÃâÃ³¸¦ ¸í½ÃÇØ ÁÖ½Ã¸é µË´Ï´Ù. 
 */
package net.javajigi.board.web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.javajigi.board.model.Board;
import net.javajigi.board.service.BoardService;
import net.javajigi.board.util.BoardUtil;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.bind.RequestUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

public class BoardController extends MultiActionController {
	protected final Log logger = LogFactory.getLog(getClass());
	
	private static final int DEFAULT_CURRENT_PAGE = 1;

	private static final int DEFAULT_COUNT_PER_PAGE = 10;

	private BoardService boardService = null;

	public void setBoardService(BoardService boardService) {
		this.boardService = boardService;
	}

	public ModelAndView list(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		if (logger.isDebugEnabled()) {
			logger.debug("entering 'list' method...");
		}

		int currentPage = RequestUtils.getIntParameter(request, "currentPage",
				DEFAULT_CURRENT_PAGE);
		int countPerPage = RequestUtils.getIntParameter(request,
				"countPerPage", DEFAULT_COUNT_PER_PAGE);

		if (logger.isDebugEnabled()) {
			logger.debug("currentPage : " + currentPage);
			logger.debug("countPerPage : " + countPerPage);
		}
		
		String pageDivideForm = dividePageForm(currentPage, countPerPage, request);
		request.setAttribute("pageDivideForm", pageDivideForm);
		
		return new ModelAndView("board/list", "boardList", boardService
				.findBoardList(currentPage, countPerPage));
	}
	
	private String dividePageForm(int currentPage, int countPerPage, HttpServletRequest request) {
		int totalNo = boardService.getBoardTotalCount();
		int endPage = BoardUtil.endPage(currentPage, countPerPage, totalNo);
		
		StringBuffer sb = new StringBuffer();
		
		for (int i=0; i < endPage; i++) {
			sb.append("<a href=\"");
			sb.append(request.getContextPath());
			sb.append("/board/board.do?currentPage=");
			sb.append(i+1);
			sb.append("&countPerPage=");
			sb.append(countPerPage);
			sb.append("\">");
			sb.append(i+1);
			sb.append("</a>");
			if( i < (endPage-1) ){
				sb.append("&nbsp");
			}
		}
		
		return sb.toString();
	}

	public ModelAndView view(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		if (logger.isDebugEnabled()) {
			logger.debug("entering 'view' method...");
		}

		int boardNo = RequestUtils.getRequiredIntParameter(request, "boardNo");

		if (logger.isDebugEnabled()) {
			logger.debug("boardNo : " + boardNo);
		}

		return new ModelAndView("board/view", "board", boardService
				.findBoardWithView(boardNo));
	}
	
	public ModelAndView remove(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		if (logger.isDebugEnabled()) {
			logger.debug("entering 'remove' method...");
		}
		
		int boardNo = RequestUtils.getRequiredIntParameter(request, "boardNo");
		String password = RequestUtils.getRequiredStringParameter(request, "password");

		if (logger.isDebugEnabled()) {
			logger.debug("boardNo : " + boardNo);
		}
		
		Board board = boardService.findBoard(boardNo);
		if( password.equals(board.getPassword()) ) {
			boardService.removeBoard(boardNo);
			
			return list(request, response);
		} else {
			request.setAttribute("error", "ºñ¹Ð¹øÈ£°¡ Æ²¸³´Ï´Ù.");
			return new ModelAndView("board/remove"); 
		}
	}
	
	public ModelAndView removeFile(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		if (logger.isDebugEnabled()) {
			logger.debug("entering 'remove' method...");
		}
		
		int boardNo = RequestUtils.getRequiredIntParameter(request, "boardNo");
		int boardFileNo = RequestUtils.getRequiredIntParameter(request, "boardFileNo");
		String password = RequestUtils.getRequiredStringParameter(request, "password");

		if (logger.isDebugEnabled()) {
			logger.debug("boardNo : " + boardNo);
			logger.debug("boardFileNo : " + boardFileNo);
		}
		
		Board board = boardService.findBoard(boardNo);
		if( password.equals(board.getPassword()) ) {
			boardService.removeBoardFile(boardFileNo);
			
			return view(request, response);
		} else {
			throw new Exception("ºñ¹Ð¹øÈ£°¡ Æ²¸³´Ï´Ù.");
		}
	}
}
