package kcg.imis.notice.service;

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

import javax.annotation.Resource;

import kcg.imis.cmmn.file.FileUploadUtil;
import kcg.imis.notice.mapper.NoticeMapper;
import kcg.imis.notice.vo.NoticeSearchVO;
import kcg.imis.notice.vo.NoticeVO;

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

import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;

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

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

		/* seq 및 insert 결과 */
		map = noticeMapper.insertNotice(noticeVO);
		
		int seq = (Integer) map.get("npIdx");
		
		if (seq > 0) {
			noticeVO.setNpIdx(seq);
		} else {
			throw new Exception();
		}
			
		return map;
	}
	
	
	/**
	 * 게시물을 DB에 업데이트 한다.
	 * 
	 * @param noticeVO 게시물 VO
	 * @return 성공 - 1, 실패 - 0
	 * @throws Exception 기본 예외 처리
	 */
	private int updateNotice(final NoticeVO noticeVO) throws Exception {
		return noticeMapper.updateNotice(noticeVO);
	};
	
	/**
	 * 게시물을 업데이트 한다.
	 * 
	 * @param noticeVO 게시물 VO
	 * @param fileMap MultipartFile형태의 파일정보 
	 * @param deleteFiles 삭제할 파일리스트
	 * @return HashMap/ seq : 게시물 번호 , result : 성공 - 1, 실패 - 0
	 */
	@Override
	@Transactional
	public HashMap<String, Object> update(final NoticeVO noticeVO) throws Exception {
		
		HashMap<String, Object> map = new HashMap<String, Object>();
		int result = 0;
		
		result = this.updateNotice(noticeVO);
		
		if (result != 1) {
			throw new Exception();
		} else {
			map.put("result", result);
			map.put("npIdx", noticeVO.getNpIdx());
		}
		
		return map;
	}

	
	/**
	 * 게시물을 삭제한다.
	 * 
	 * @param bdSeq 게시물 번호
	 * @return HashMap/ seq : 게시물 번호 , result : 성공 - 1, 실패 - 0
	 */
	@Transactional
	@Override
	public HashMap<String, Object> delete(final NoticeVO noticeVO) throws Exception {
		
		HashMap<String, Object> map = new HashMap<String, Object>();
		int result = 0;
		
		/* 삭제 후 처리를 위해 데이터 캐싱 */
		NoticeVO delNotice = noticeMapper.selectNotice(noticeVO);
		
		result = noticeMapper.deleteNotice(delNotice);
		
		if (result == 1) {
			map.put("result", result);
		} else {
			throw new Exception();
		}
		
		return map;
	}

	@Override
	public List<NoticeVO> selectNoticePopupList() throws Exception {
		return noticeMapper.selectNoticePopupList();
	};
	
	
}

