/**
 * ÀÌ ¼Ò½º´Â Spring ÇÁ·¹ÀÓ¿öÅ© ¿öÅ©ºÏ¿¡¼­ »ç¿ëÇÑ ¿¹Á¦ ¼Ò½ºÀÔ´Ï´Ù. 
 * ÀÌ ¼Ò½º´Â ¸ðµç °³¹ßÀÚµéÀÌ ÀÚÀ¯·Ó°Ô ¼öÁ¤ ¹× ¹èÆ÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. 
 * ´Ü, ÀÌ ¼Ò½º¸¦ ±â¹ÝÀ¸·Î »õ·Î¿î ¾ÖÇÃ¸®ÄÉÀÌ¼ÇÀ» °³¹ßÇÒ °æ¿ì ÃâÃ³¸¦ ¸í½ÃÇØ ÁÖ½Ã¸é µË´Ï´Ù. 
 */
package net.javajigi.board.web;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.javajigi.board.model.Board;
import net.javajigi.board.model.BoardFile;
import net.javajigi.board.service.BoardService;
import net.javajigi.board.util.BoardUtil;
import net.javajigi.common.util.FileUploadUtil;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.upload.FormFile;
import org.springframework.web.bind.RequestUtils;

public class BoardAction extends DispatchAction {
	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;

	private String realUploadPath = null;

	public void setBoardService(BoardService boardService) {
		this.boardService = boardService;
	}

	public void setRealUploadPath(String realUploadPath) {
		this.realUploadPath = realUploadPath;
	}

	public ActionForward list(ActionMapping mapping, ActionForm form,
			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);
		request.setAttribute("boardList", boardService.findBoardList(
				currentPage, countPerPage));

		return mapping.findForward("list");
	}

	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?method=list&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 ActionForward view(ActionMapping mapping, ActionForm form,
			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);
		}

		request.setAttribute("board", boardService.findBoard(boardNo));

		return mapping.findForward("view");
	}

	public ActionForward add(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		if (logger.isDebugEnabled()) {
			logger.debug("entering 'add' method...");
		}

		BoardForm boardForm = (BoardForm) form;
		Board board = boardForm.getBoard();
		board.setBoardFiles(getBoardFileList(boardForm.getFiles()));
		boardService.addBoard(board);

		return list(mapping, form, request, response);
	}

	public ActionForward modify(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		if (logger.isDebugEnabled()) {
			logger.debug("entering 'modify' method...");
		}

		BoardForm boardForm = (BoardForm) form;
		Board board = boardForm.getBoard();
		board.setBoardFiles(getBoardFileList(boardForm.getFiles()));
		boardService.updateBoard(board);

		return list(mapping, form, request, response);
	}

	protected List getBoardFileList(FormFile[] files) {
		List boardFileList = new ArrayList();
		for (int i = 0; i < files.length; i++) {
			FormFile formFile = files[i];

			if( formFile.getFileSize() > 0 ) {
				BoardFile boardFile = FileUploadUtil.uploadFormFile(formFile,
						realUploadPath);
				boardFileList.add(boardFile);				
			}
		}
		
		return boardFileList;
	}

	public ActionForward editForm(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		if (logger.isDebugEnabled()) {
			logger.debug("entering 'editForm' method...");
		}

		request.setAttribute("board", findBoard(request));

		return mapping.findForward("edit");
	}

	private Board findBoard(HttpServletRequest request) {
		if (logger.isDebugEnabled()) {
			logger.debug("entering 'findBoard' method...");
		}

		int boardNo = RequestUtils.getIntParameter(request, "boardNo", 0);

		if (logger.isDebugEnabled()) {
			logger.debug("received boardNo : " + boardNo);
		}

		if (boardNo != 0) {
			Board board = boardService.findBoard(boardNo);

			if (board == null) {
				return new Board();
			}

			return board;
		} else {
			return new Board();
		}
	}

	public ActionForward delete(ActionMapping mapping, ActionForm form,
			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(mapping, form, request, response);
		} else {
			request.setAttribute("error", "ºñ¹Ð¹øÈ£°¡ Æ²¸³´Ï´Ù.");
			return mapping.findForward("delete");
		}
	}

	public ActionForward deleteFile(ActionMapping mapping, ActionForm form,
			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(mapping, form, request, response);
		} else {
			request.setAttribute("error", "ºñ¹Ð¹øÈ£°¡ Æ²¸³´Ï´Ù.");
			return mapping.findForward("deleteFile");
		}
	}
}
