package kcg.imis.board.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import kcg.imis.board.mapper.BoardMapper;
import kcg.imis.board.vo.BoardSearchVO;
import kcg.imis.board.vo.BoardVO;
import kcg.imis.board.vo.SearchVO;
import kcg.imis.cmmn.egov.file.EgovFileMngUtil;
import kcg.imis.cmmn.egov.vo.FileVO;
import kcg.imis.cmmn.file.FileUploadUtil;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;

/**
 * 
  * @FileName : BoardServiceImpl.java
  * @Project : 국제해양프로젝트
  * @Date : 2018. 3. 16. 
  * @작성자 : Moon
  * @변경이력 : 
  * @프로그램 설명 : 게시판 관련 서비스 객체
 */
@Service("boardService")
public class BoardServiceImpl extends EgovAbstractServiceImpl implements BoardService {
	
	/**
	 * BoardMapper - 게시판 데이터처리에 관한 Mapper 클래스
	 **/
    @Resource(name = "boardMapper")
	private BoardMapper boardMapper;
    
    @Resource(name = "fileUploadUtil")
    private FileUploadUtil fileUtil;
    
    @Resource(name = "EgovFileMngUtil")
    private EgovFileMngUtil egovFileUtil;
	/**
	 * 게시판 목록 화면을 반환한다.
	 * 
	 * @param searchVO 검색, 페이지 정보 객체
	 * @return 게시물 리스트
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public List<BoardVO> selectList(final BoardSearchVO searchVO) throws Exception {
		return boardMapper.selectBoardList(searchVO);
	}
	
    /**
	 * 검색 키워드에 따른 총 게시물 개수를 조회한다.
	 * 
	 * @param searchVO 검색, 페이지 정보 객체
	 * @return 게시물 개수
	 * @exception Exception 기본 예외 처리
	 */
	@Override
	public int selectListCnt(final BoardSearchVO searchVO) throws Exception {
		return boardMapper.selectBoardListTotCnt(searchVO);
	}
	
	/**
	 * 전체 게시물 개수를 가져온다.
	 * 
	 * @return 게시물 개수
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public int selectTotalCnt(final BoardSearchVO searchVO) throws Exception {
		return boardMapper.selectBoardTotalCnt(searchVO);
	}
	

	/**
	 * 선택한 게시물의 내용을 반환한다.
	 * 
	 * @param bdSeq 게시판 
	 * @return 선택한 게시물 내용 반환
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public BoardVO select(final BoardVO boardVO) throws Exception {
		
		boardMapper.hitBoard(boardVO);
		BoardVO board = boardMapper.selectBoard(boardVO);
		board.setPrevSeq(boardMapper.selectPrevSeq(board));
		board.setNextSeq(boardMapper.selectNextSeq(board));
		return board;
				
	}	
	
	
	/**
	 * 게시물을 추가한다.
	 * 
	 * @param boardVO 게시판 내용 구성 객체
	 * @return HashMap/ seq : 게시물 , result : 성공 - 1, 실패 - 0
	 * @throws Exception 기본 예외 처리
	 */
	private HashMap<String, Object> insert(final BoardVO boardVO) throws Exception {
		
		HashMap<String, Object> map = new HashMap<String, Object>();

		/* seq 및 insert 결과 */
		map = boardMapper.insertBoard(boardVO);
		
		int seq = (Integer) map.get("bdIdx");
		
		if (seq > 0) {
			boardVO.setBdIdx(seq);
		} else {
			throw new Exception();
		}
			
		return map;
	}
	
	/**
	 * 게시물을 추가한다.
	 * 
	 * @param boardVO 게시판 내용 구성 객체
	 * @param fileMap 업로드 파일정보체
	 * @return HashMap/ seq : 게시물 , result : 성공 - 1, 실패 - 0
	 * @exception Exception 기본 예외 처리
	 */
	@Override
	@Transactional
	public HashMap<String, Object> insert(final BoardVO boardVO, final Map<String, MultipartFile> fileMap) throws Exception {
		
		List<FileVO> fileList = egovFileUtil.parseFileInf(fileMap, "_", 0, "", "Globals.fileStorePath");
		
		StringBuffer newFileNameSb = new StringBuffer();
		StringBuffer realFileNameSb = new StringBuffer();
		for(FileVO file : fileList){	
			newFileNameSb.append(file.getStreFileNm());
			realFileNameSb.append(file.getOrignlFileNm());
			if (file == fileList.get(fileList.size() - 1)) continue;
			newFileNameSb.append(";");
			realFileNameSb.append(";");
		}
		
		boardVO.setBdFileNames(realFileNameSb.toString());
		boardVO.setBdFiles(newFileNameSb.toString());
		
		return insert(boardVO);
	}
	
	
	/**
	 * 게시물을 DB에 업데이트 한다.
	 * 
	 * @param boardVO 게시물 VO
	 * @return 성공 - 1, 실패 - 0
	 * @throws Exception 기본 예외 처리
	 */
	private int updateBoard(final BoardVO boardVO) throws Exception {
		return boardMapper.updateBoard(boardVO);
	};
	
	/**
	 * 게시물을 업데이트 한다.
	 * 
	 * @param boardVO 게시물 VO
	 * @param fileMap MultipartFile형태의 파일정보 
	 * @param deleteFiles 삭제할 파일리스트
	 * @return HashMap/ seq : 게시물 번호 , result : 성공 - 1, 실패 - 0
	 */
	@Override
	@Transactional
	public HashMap<String, Object> update(final BoardVO boardVO, final Map<String, MultipartFile> fileMap, final String[] deleteFiles) throws Exception {
		
		HashMap<String, Object> map = new HashMap<String, Object>();
		int result = 0;
		
		//기존 업로드 파일 목록들
		List<String> saveFileList = boardVO.getSaveFileNames();
		List<String> orgFileList = boardVO.getOrgFileNames();
		
		if(deleteFiles != null){
			for(String deleteFile : deleteFiles){
				int index = saveFileList.indexOf(deleteFile);
				if(index > -1){
					saveFileList.remove(index);
					orgFileList.remove(index);
				}
			}
		}
	
		StringBuffer newSaveFileNameSb = new StringBuffer();
		StringBuffer newOrgFileNameSb = new StringBuffer();
		
		for(String fileName : saveFileList){	
			newSaveFileNameSb.append(fileName);
			if (fileName.equals(saveFileList.get(saveFileList.size() - 1))) continue;
			newSaveFileNameSb.append(";");
		}
		
		for(String fileName : orgFileList){	
			newOrgFileNameSb.append(fileName);
			if (fileName.equals(orgFileList.get(orgFileList.size() - 1))) continue;
			newOrgFileNameSb.append(";");
		}
		
		//새로 업로드된 파일 목록들
		List<FileVO> fileList = egovFileUtil.parseFileInf(fileMap, "_", 0, "", "Globals.fileStorePath");
		
		for(FileVO file : fileList){
			if(newSaveFileNameSb.length() > 0){
				newSaveFileNameSb.append(";");
				newOrgFileNameSb.append(";");
			}
			
			newSaveFileNameSb.append(file.getStreFileNm());
			newOrgFileNameSb.append(file.getOrignlFileNm());
			if (file == fileList.get(fileList.size() - 1)) continue;
			newSaveFileNameSb.append(";");
			newOrgFileNameSb.append(";");
		}
		
		boardVO.setBdFiles(newSaveFileNameSb.toString());
		boardVO.setBdFileNames(newOrgFileNameSb.toString());
		
		
		result = this.updateBoard(boardVO);
		
		if (result != 1) {
			throw new Exception();
		} else {
			map.put("result", result);
			map.put("bdIdx", boardVO.getBdIdx());
		}
		
		return map;
	}

	
	/**
	 * 게시물을 삭제한다.
	 * 
	 * @param bdSeq 게시물 번호
	 * @return HashMap/ seq : 게시물 번호 , result : 성공 - 1, 실패 - 0
	 */
	@Transactional
	@Override
	public HashMap<String, Object> delete(final BoardVO boardVO) throws Exception {
		
		HashMap<String, Object> map = new HashMap<String, Object>();
		int result = 0;
		
		/* 삭제 후 처리를 위해 데이터 캐싱 */
		BoardVO delBoard = boardMapper.selectBoard(boardVO);
		
		result = boardMapper.deleteBoard(delBoard);
		
		if (result == 1) {
			/* 이전 글, 다음 글의 이전/다음 시퀀스 재조정 */
			/*int prevSeq = boardVO.getPrevSeq();
			int nextSeq = boardVO.getNextSeq();
			if (prevSeq > 0) {
				this.updatePrevNextSeq(BoardVOHandler.getBoardVO(boardVO.getId(), prevSeq), "N", nextSeq);
			}
			if (nextSeq > 0) {
				this.updatePrevNextSeq(BoardVOHandler.getBoardVO(boardVO.getId(), nextSeq), "P", prevSeq);
			}*/
			
			/* 파일을 삭제한다. 
			boardFileService.deleteAndRemoveFiles(BoardVOHandler.getBFileVO(delBoard));
			
			 댓글을 삭제한다. 
			boardCommentService.deleteAll(BoardVOHandler.getBCommentVO(delBoard));*/
			
			map.put("result", result);
		} else {
			throw new Exception();
		}
		
		return map;
	};
	
	@Override
	public List<BoardVO> selectListAll(BoardSearchVO searchVO) throws Exception {
		return null;
	}

	@Override
	public Map<String, Object> searchBoard(SearchVO searchVO) throws Exception {
		
		Map<String, Object> resultMap = new HashMap<String, Object>();
		
		String[] bbsIds = {"confer", "dokdo", "image", "imo", "joint", "law", "notice",  "state", "world01", "world02", "world03"};
		String[] bbsNames = {"국제회의", "독도·이어도", "이미지", "해적/IMO 등", "정보요청", "국제해양법 검토", "공지사항",  "국제해양정세", "세계해양분쟁DB-해양치안기관", "세계해양분쟁DB-해양정책·동향", "세계해양분쟁DB-해양분쟁"};
		
		int totalCnt = 0;
		
		List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
		for( int i = 0 ; i < bbsIds.length ; i ++){
			
			Map<String, Object> board = new HashMap<String, Object>();
			
			String bbsId = bbsIds[i];
			String bbsName = bbsNames[i];
			
			searchVO.setSearchType("content");
			searchVO.setBbsId(bbsId);;
			
			List<BoardVO> list1 = boardMapper.searchBoardList(searchVO);
			int cnt1 = boardMapper.searchBoardCnt(searchVO);
			
			searchVO.setSearchType("subject");
			List<BoardVO> list2 = boardMapper.searchBoardList(searchVO);
			int cnt2 = boardMapper.searchBoardCnt(searchVO);
			
			searchVO.setSearchType("file");
			List<BoardVO> list3 = boardMapper.searchBoardList(searchVO);
			int cnt3 = boardMapper.searchBoardCnt(searchVO);
			
			searchVO.setSearchType("name");
			List<BoardVO> list4 = boardMapper.searchBoardList(searchVO);
			int cnt4 = boardMapper.searchBoardCnt(searchVO);
			
			int count = cnt1 + cnt2 + cnt3 + cnt4;
			
			board.put("contentList", list1);
			board.put("subjectList", list2);
			board.put("fileList", list3);
			board.put("nameList", list4);
			
			board.put("cnt", count);
			board.put("name", bbsName);
			
			list.add(board);
			
			totalCnt += count;
			
		}
		
		resultMap.put("list", list);
		resultMap.put("totalCnt", totalCnt);
		
		return resultMap;
		
	}
	
	
}

