package brd;

import java.io.File;

import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;

import mem.MemberDAO;
import mem.MemberVO;

@WebServlet("/board/*")
public class BoardController extends HttpServlet{
	//private static String ARTICLE_IMAGE_REPO = "C:\\myJSP\\board\\G_image";
	private static String ARTICLE_IMAGE_REPO = File.separator +"dir";
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	BoardService boardService;
	ArticleVO articleVO;
	MemberDAO memberDAO;
	List<MemberVO> membersList = new ArrayList();
	
	public void init(ServletConfig config) throws ServletException{
		super.init(config);
		boardService = new BoardService();
		articleVO = new ArticleVO();
		memberDAO = new MemberDAO();
	}
	
	protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
		doHandle(request,response);
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request,response);
	}
	
	private void doHandle(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
		//System.out.println(Paths.get("1", "2"));
		String nextPage = "";
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		HttpSession session = request.getSession();
		System.out.println("request.getRequestURL() = "+request.getRequestURL());
		System.out.println("request.getPathInfo() = "+request.getPathInfo());
		String action = request.getPathInfo();
		System.out.println("action:"+action);
		
		if(session.getAttribute("id")==null) {
			PrintWriter pw = response.getWriter();
			pw.write("<script> alert('αּ'); location.href='"+request.getContextPath()+"/login/loginForm.do';</script>");
			return;
		}
		try {
			System.out.println("nextPage 1 ========== "+nextPage);
			List<ArticleVO> articlesList = new ArrayList<ArticleVO>();
			if((action==null && session.getAttribute("id").equals("admin")) || action.equals("/listArticles.do")) {
				String id = (String) session.getAttribute("id");
				System.out.println("id = ================ "+id);
				if(id.equals("admin")) {
					articlesList = boardService.listAllArticles();
				}else {
					articlesList = boardService.listArticles(id);
				}
				System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
				request.setAttribute("articlesList",articlesList);
				nextPage = "/board2/listArticles.jsp";
			
			}else if(action.equals("/articleForm.do")) {
				List<MemberVO> membersList = new ArrayList(); 
				membersList=boardService.findmembers();
				request.setAttribute("membersList", membersList);
				nextPage = "/board2/articleForm.jsp";
			}else if(action.equals("/addArticle.do")) {
				/*
				String[] mem = request.getParameterValues("mem");
				for(String memid : mem) {
					System.out.println("memid =================="+memid);
				}
				*/
				int articleNO = 0;
				Map<String,String> articleMap = upload(request,response);
				String title = articleMap.get("title");
				String content = articleMap.get("content");
				String FileName = articleMap.get("FileName");
				
				for(MemberVO id : membersList) {
					System.out.println("ididididdidididididid ======== "+id.getId());
				}
				//System.out.println("mem[1]="+articleMap.get("mem"));
				
				articleVO.setParentNO(0);
				articleVO.setId((String)session.getAttribute("id"));
				articleVO.setTitle(title);
				articleVO.setContent(content);
				articleVO.setFileName(FileName);
				articleNO = boardService.addArticle(articleVO,membersList);
				
				if(FileName!=null && FileName.length()!=0) {
					//File srcFile = new File(ARTICLE_IMAGE_REPO+"\\"+"temp"+"\\"+FileName);
					File srcFile = new File(ARTICLE_IMAGE_REPO+File.separator +"temp"+File.separator+FileName);
					
					//File destDir = new File(ARTICLE_IMAGE_REPO+"\\"+articleNO);
					File destDir = new File(ARTICLE_IMAGE_REPO+File.separator +articleNO);
					destDir.mkdirs();
					
					FileUtils.moveToDirectory(srcFile, destDir, true);
					String dir_name=ARTICLE_IMAGE_REPO+File.separator +articleNO;
					
					boardService.intohdfs(dir_name, articleNO, FileName);
					
					File[] deleteList = destDir.listFiles();
					for(int i = 0;i<deleteList.length;i++) {
						System.out.println("i = "+i+"  = "+deleteList[i].delete());
					}
					System.out.println(" = "+destDir.getName()+"    = "+destDir.delete());
				}
				PrintWriter pw = response.getWriter();
				pw.print("<script>"
						+ "alert('Ʈ ߽߰ϴ.');"
						+ "location.href='"+request.getContextPath()+"/member/"+"listMembers.do';"
						+"</script>");
				System.out.println("id_+_+_+_+_+="+session.getAttribute("id"));
				return;
			}else if(action.equals("/viewArticle.do")) {
				String articleNO = request.getParameter("articleNO");
				articleVO = boardService.viewArticle(Integer.parseInt(articleNO));
				System.out.println("123456789123456789====="+articleVO.getFileName());
				request.setAttribute("article", articleVO);
				nextPage = "/board2/viewArticle.jsp";
			}else if(action.equals("/modArticle.do")) {
				Map<String,String> articleMap = upload(request,response);
				int articleNO = Integer.parseInt(articleMap.get("articleNO"));
				articleVO.setArticleNO(articleNO);
				String title = articleMap.get("title");
				String content = articleMap.get("content");
				String FileName = articleMap.get("FileName");
				articleVO.setParentNO(0);
				articleVO.setId((String)session.getAttribute("id"));
				articleVO.setTitle(title);
				articleVO.setContent(content);
				articleVO.setFileName(FileName);
				boardService.modArticle(articleVO);
				
				if(FileName != null && FileName.length() !=0) {
					String originalFileName = articleMap.get("originalFileName");
					//File srcFile = new File(ARTICLE_IMAGE_REPO+ "\\" + "temp" + "\\" + FileName);
					File srcFile = new File(ARTICLE_IMAGE_REPO+ File.separator  + "temp" + File.separator  + FileName);
					//File destDir = new File(ARTICLE_IMAGE_REPO+ "\\" + articleNO);
					File destDir = new File(ARTICLE_IMAGE_REPO+ File.separator  + articleNO);
					destDir.mkdirs();
					FileUtils.moveFileToDirectory(srcFile, destDir, true);
					//File oldFile = new File(ARTICLE_IMAGE_REPO+"\\"+articleNO+"\\"+originalFileName);
					File oldFile = new File(ARTICLE_IMAGE_REPO+File.separator +articleNO+File.separator +originalFileName);
					boardService.moddfs(ARTICLE_IMAGE_REPO,articleNO,FileName);//oldFile.getAbsolutePath()
					oldFile.delete();
				}
				PrintWriter pw = response.getWriter();
				pw.print("<script>"+" alert(' ߽ϴ');" + " location.href='"+request.getContextPath()
						+"/board/viewArticle.do?articleNO="+articleNO+"';"+"</script>");
				return;
			}else if (action.equals("/removeArticle.do")) {
				int articleNO = Integer.parseInt(request.getParameter("articleNO"));
				List<Integer> articleNOList = boardService.removeArticle(articleNO);
				for (int _articleNO : articleNOList) {
					boardService.deletedfs(_articleNO);
					//File imgDir = new File(ARTICLE_IMAGE_REPO + "\\" + _articleNO);
					File imgDir = new File(ARTICLE_IMAGE_REPO + File.separator + _articleNO);
					if (imgDir.exists()) {
						FileUtils.deleteDirectory(imgDir);
					}
					
				}

				PrintWriter pw = response.getWriter();
				if(session.getAttribute("id").equals("admin")) {
					pw.print("<script>" + "  alert(' ߽ϴ.');" + " location.href='" + request.getContextPath()
					+ "/member/listMembers.do';" + "</script>");
				}else {
					pw.print("<script>" + "  alert(' ߽ϴ.');" + " location.href='" + request.getContextPath()
					+ "/board/listArticles.do';" + "</script>");
				}
				return;
			}else if(action.equals("/replyForm.do")) {
				System.out.println("parentNO========+=++=++=="+request.getParameter("parentNO").trim());
				int parentNO = Integer.parseInt(request.getParameter("parentNO").trim());
				session = request.getSession();
				System.out.println("session==========+++=+++= "+session);
				System.out.println("session id ==========+++=+++= "+session.getAttribute("id"));
				session.setAttribute("parentNO", parentNO);
				
				PrintWriter pw = response.getWriter();
				pw.print("<script> location.href='" + request.getContextPath()+ "/board2/replyForm.jsp';" + "</script>");
				return;
			}else if(action.equals("/addReply.do")) {
				session = request.getSession();
				int parentNO = (Integer) session.getAttribute("parentNO");
				session.removeAttribute("parentNO");
				Map<String,String> articleMap = upload(request,response);
				String title = articleMap.get("title");
				String content = articleMap.get("content");
				String FileName = articleMap.get("FileName");
				articleVO.setParentNO(parentNO);
				articleVO.setId((String)session.getAttribute("id"));
				articleVO.setTitle(title);
				articleVO.setContent(content);
				articleVO.setFileName(FileName);
				int articleNO = boardService.addReply(articleVO);
				if (FileName != null && FileName.length() != 0) {
					//File srcFile = new File(ARTICLE_IMAGE_REPO + "\\" + "temp" + "\\" + FileName);
					File srcFile = new File(ARTICLE_IMAGE_REPO + File.separator  + "temp" + File.separator  + FileName);
					//File destDir = new File(ARTICLE_IMAGE_REPO + "\\" + articleNO);
					File destDir = new File(ARTICLE_IMAGE_REPO + File.separator  + articleNO);
					destDir.mkdirs();
					FileUtils.moveFileToDirectory(srcFile, destDir, true);
					boardService.intohdfs(ARTICLE_IMAGE_REPO, articleNO, FileName);
					
					File[] deleteList = destDir.listFiles();
					for(int i = 0;i<deleteList.length;i++) {
						System.out.println("i = "+i+"  = "+deleteList[i].delete());
					}
					System.out.println(" = "+destDir.getName()+"    = "+destDir.delete());
				}
				PrintWriter pw = response.getWriter();
				pw.print("<script>" + "  alert(' ߽߰ϴ.');" + " location.href='" + request.getContextPath()
						+ "/board/viewArticle.do?articleNO="+articleNO+"';" + "</script>");
				return;
			}

			RequestDispatcher dispatch = request.getRequestDispatcher(nextPage);
			dispatch.forward(request, response);
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("nextPage 3 ========== "+nextPage);
			System.out.println("request.getRequestURL() = "+request.getRequestURL());
			System.out.println("request.getPathInfo() = "+request.getPathInfo());
			e.printStackTrace();
		}
	}
	
	private Map<String,String> upload(HttpServletRequest request,HttpServletResponse response){
		Map<String,String> articleMap = new HashMap<String,String>();
		//List<MemberVO> membersList = new ArrayList();
		String encoding = "utf-8";
		File currentDirPath = new File(ARTICLE_IMAGE_REPO);
		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setRepository(currentDirPath);
		factory.setSizeThreshold(1024*1024);
		ServletFileUpload upload = new ServletFileUpload(factory);
		try {
			List items = upload.parseRequest(request);
			for(int i=0;i<items.size();i++) {
				FileItem fileItem = (FileItem)items.get(i);
				if(fileItem.isFormField()) {
					if(fileItem.getFieldName().equals("mem")) {
						MemberVO vo = new MemberVO();
						String id = fileItem.getString(encoding);
						vo.setId(id);
						membersList.add(vo);
					}
					System.out.println(fileItem.getFieldName()+" = "+fileItem.getString(encoding));
					articleMap.put(fileItem.getFieldName(), fileItem.getString(encoding));
				}else {
					System.out.println("Ķ͸ : "+fileItem.getFieldName());
					System.out.println("ϸ : "+fileItem.getName());
					System.out.println(" ũ : "+fileItem.getSize()+"bytes");
					articleMap.put(fileItem.getFieldName(), fileItem.getName());
					System.out.println("1 ϸ : "+fileItem.getName()+"  len : "+fileItem.getName().length());
					if(fileItem.getSize()>0) {
						int idx = fileItem.getName().lastIndexOf("\\");
						if(idx==-1) {
							idx=fileItem.getName().lastIndexOf("/");
						}
						
						String fileName = fileItem.getName().substring(idx+1);
						System.out.println("2 ϸ : "+fileName+"  len : "+fileName.length());
						articleMap.put(fileItem.getFieldName(), fileName);
						//File uploadFile = new File(currentDirPath+"\\temp\\"+fileName);
						File uploadFile = new File(currentDirPath+File.separator +"temp"+File.separator +fileName);
						fileItem.write(uploadFile);
					}
				}
			}
			
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return articleMap;
	}
	
}
