package kcg.faics.cmmn.bbs;

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

import org.springframework.web.multipart.MultipartFile;

/**
 * 게시판 공용 첨부파일 관련 서비스 Interface.
 * 
 * @author kimnomin
 *
 * @param <T>
 *            제네릭 타입.
 */
public interface BaseFileService<T> {

	/**
	 * 파일 정보를 반환한다.
	 * 
	 * @param fileVO
	 *            제네릭 타입의 파일 관련 VO
	 * @return 제네릭 타입의 파일 정보
	 * @throws Exception
	 *             기본 예외 처리
	 */
	T select(T fileVO) throws Exception;

	/**
	 * 파일 목록을 반환한다.
	 * 
	 * @param fileVO
	 *            제네릭 타입의 파일 관련 VO
	 * @return 제네릭 타입의 파일 목록
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<T> selectList(T fileVO) throws Exception;

	/**
	 * 파일 정보를 입력한다.
	 * 
	 * @param fileVO
	 *            제네릭 타입의 File 관련 VO
	 * @return 1-성공, 0-실패
	 * @throws Exception
	 *             기본 예외 처리
	 */
	int insert(T fileVO) throws Exception;

	/**
	 * 파일 정보를 삭제한다.
	 * 
	 * @param fileVO
	 *            제네릭 타입의 File 관련 VO
	 * @return 1-성공, 0-실패
	 * @throws Exception
	 *             기본 예외 처리
	 */
	int delete(T fileVO) throws Exception;

	/**
	 * 파일을 폴더에 저장하고 파일 정보를 입력한다.
	 * 
	 * @param fileVO
	 *            제네릭 타입의 File 관련 VO
	 * @param fileMap
	 *            파일 객가 담긴 Map 객체
	 * @return 1-성공, 0-실패
	 * @throws Exception
	 *             기본 예외 처리
	 */
	int insertAndSaveFiles(T fileVO, Map<String, MultipartFile> fileMap)
			throws Exception;

	/**
	 * 한 건의 파일을 폴더에서 제거하고 파일 정보를 삭제한다.
	 * 
	 * @param fileVO
	 *            제네릭 타입의 File 관련 VO
	 * @return 1-성공, 0-실패
	 * @throws Exception
	 *             기본 예외 처리
	 */
	int deleteAndRemoveFile(T fileVO) throws Exception;

	/**
	 * fileVO의 parentSeq인 모든 파일을 폴더에서 제거하고 파일 정보를 삭제한다.
	 * 
	 * @param fileVO
	 *            제네릭 타입의 File 관련 VO
	 * @return 1-성공, 0-실패
	 * @throws Exception
	 *             기본 예외 처리
	 */
	int deleteAndRemoveFiles(T fileVO) throws Exception;
}
