package kcg.faics.cmmn.bbs;

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

import org.springframework.web.multipart.MultipartFile;

/**
 * 기본형 게시판 비지니스 로직 인터페이스.
 * 기본적인 CRUD를 지원한다. 
 * 
 * @author kimnomin
 *
 * @param <SearchT>
 *            페이징 및 검색조건 VO
 * @param <DataT>
 *            실제 데이터 VO
 */
public interface BaseBbsService<SearchT, DataT> {
	/**
	 * 데이터 한 건을 반환한다.
	 * 
	 * @param dataVO
	 *            조회할 VO (대부분 PK의 값으로 조회한다.)
	 * @return 데이터 한 건
	 * @throws Exception
	 *             기본 예외 처리
	 */
	DataT select(DataT dataVO) throws Exception;

	/**
	 * 페이징 처리없이 데이터 전체 목록을 반환한다.
	 * 
	 * @param searchVO 검색정보 객체
	 * @return 데이터 목록
	 * @throws Exception 기본 예외 처리
	 */
	List<DataT> selectListAll(SearchT searchVO) throws Exception;
	
	/**
	 * 데이터 목록을 반환한다.
	 * 
	 * @param searchVO
	 *            검색, 페이지 정보 객체
	 * @return 데이터 목록
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<DataT> selectList(SearchT searchVO) throws Exception;

	/**
	 * 데이터 목록 개수를 반환한다.
	 * 
	 * @param searchVO
	 *            검색, 페이지 정보 객체
	 * @return 데이터 목록 갯수
	 * @throws Exception
	 *             기본 예외 처리
	 */
	int selectListCnt(SearchT searchVO) throws Exception;

	/**
	 * 데이터 총 개수를 반환한다.
	 * 
	 * @param searchVO
	 *            검색, 페이지 정보 객체
	 * @return 데이터 총 개수
	 * @throws Exception
	 *             기본 예외 처리
	 */
	int selectTotalCnt(SearchT searchVO) throws Exception;

	/**
	 * 데이터를 입력한다.
	 * 
	 * @param dataVO
	 *            입력할 VO
	 * @param fileMap
	 *            파일이 담긴 Map 객체
	 * @return 맵 객체 { result: 1-성공 0-실패, idx: 등록된 게시물 idx }
	 * 
	 * @throws Exception
	 *             기본 예외 처리
	 */
	HashMap<String, Object> insert(DataT dataVO,
			Map<String, MultipartFile> fileMap) throws Exception;

	/**
	 * 데이터를 수정한다.
	 * 
	 * @param dataVO
	 *            수정할 VO
	 * @param fileMap
	 *            파일이 담긴 Map 객체
	 * @param deleteFiles
	 *            삭제할 파일리스트
	 * @return 맵 객체 { result: 1-성공 0-실패, idx: 수정된 게시물 idx }
	 * @throws Exception
	 *             기본 예외 처리
	 */
	HashMap<String, Object> update(DataT dataVO,
			Map<String, MultipartFile> fileMap, String[] deleteFiles) throws Exception;

	/**
	 * 데이터를 삭제한다.
	 * 
	 * @param dataVO
	 *            삭제할 VO
	 * @return 맵 객체 { result: 1-성공 0-실패, idx: 삭제된 게시물 idx }
	 * @throws Exception
	 *             기본 예외 처리 
	 */
	HashMap<String, Object> delete(DataT dataVO) throws Exception;
}
