/** 
 * FaEquipmentServiceImpl.java
 * @author 임새미 
 * @since 2016. 10. 13.
 *
 *  	 수정일                     수정자                                       수정내용
 *  -------------	--------	---------------------------
 *  2016. 10. 13. 	    임새미				       최초생성
 * 
 */
package kcg.faics.equip.service.impl;

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

import javax.annotation.Resource;

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

import kcg.faics.board.util.BoardVOHandler;
import kcg.faics.board.vo.BoardFileVO;
import kcg.faics.cmmn.bbs.BaseFileService;
import kcg.faics.cmmn.egov.file.EgovFileMngUtil;
import kcg.faics.cmmn.file.FileUploadUtil;
import kcg.faics.cmmn.service.impl.CodeMapper;
import kcg.faics.equip.service.EquipmentService;
import kcg.faics.equip.vo.EquipSearchVO;
import kcg.faics.equip.vo.EquipVO;

/** 
 * FaEquipmentServiceImpl.java
 * @author 임새미 
 * @since 2016. 10. 13.
 *
 *  	 수정일                     수정자                                       수정내용
 *  -------------	--------	---------------------------
 *  2016. 10. 13. 	    임새미				       최초생성
 * 
 */
@Service("equipmentService")
public class EquipmentServiceImpl implements EquipmentService {
	
	@Resource(name = "equipmentMapper")
	EquipmentMapper equipmentMapper;
	
	@Resource(name = "codeMapper")
	CodeMapper codeMapper;
	
	/**
	 * EgovFileMngUtil  - 파일 업로드 처리에 관한 Util 클래스
	 **/
	@Resource(name = "EgovFileMngUtil")
	private EgovFileMngUtil fileUtil;
	
	/**
	 * BoardFileService - 게시판 파일에 관한 인터페이스
	 **/
	@Resource(name = "boardFileService")
	private BaseFileService<BoardFileVO> boardFileService;
	
	/**
	 * 파일 업로드 유틸리티.
	 */
	@Resource(name = "fileUploadUtil")
	private FileUploadUtil fileUploadUtil;
		
	/**
	 * 전자정부 표준프레임워크 파일관리 유틸리티.
	 */
	@Resource(name = "EgovFileMngUtil")
	private EgovFileMngUtil fileMngUtil;
	
	/**
	 * 사용자 사진 저장 경로.
	 */
	public static final String EQUIP_SAVE_PATH = "Equip.fileStorePath";
	
	/**
	 * 외사 경찰의 장비 보유 현황을 가져온다.
	 * 
	 * @return 결과 데이터를 담은 map 리스트
	 */
	@Override
	public List<HashMap<String, Object>> getEquipmentList() throws Exception {
		HashMap<String, Object> params = new HashMap<String, Object>();
		params.put("place1", codeMapper.getPlace1List(true));
		return equipmentMapper.getEquipmentList(params);
	}

	/**
	 * 외사장비의 사용실적을 가져온다.
	 * 
	 * @param params 파라미터 맵
	 * 			type - 사용 or 점검, year - 대상 연도, quater - 대상 분기
	 * @return 결과 데이터를 담은 map 리스트
	 */
	@Override
	public List<HashMap<String, Object>> getEquipUseStateList(final EquipSearchVO searchVO) throws Exception {
		List<HashMap<String, Object>> result = null;
		HashMap<String, Object> params = new HashMap<String, Object>();
		
		params.put("place1", codeMapper.getPlace1List(true));
		params.put("criteria", searchVO);
		params.put("type", (searchVO.getType().equals("a")) ? "EU_CNT" : "EU_CHECK");
		
		result = equipmentMapper.getEquipUseStateList(params);
		
		return result;
	}
	
	
	/**
	 * 외사장비의 사용실적 기록 연도 리스트를 가져온다.
	 * 
	 * @return 결과 데이터를 담은 map 리스트
	 */
	@Override
	public List<HashMap<String, Object>> getEquipYearList() throws Exception {
		List<HashMap<String, Object>> result = null;
		result = equipmentMapper.getEquipYearList();
		return result;
	}
	
	/**
	 * 외사장비 목록 가져온다.
	 * 
	 * @return 결과 데이터를 담은 map 리스트
	 */
	@Override
	public List<HashMap<String, Object>> getEquipmentCodeList() throws Exception {
		List<HashMap<String, Object>> result = null;
		result = equipmentMapper.getEquipmentCodeList();
		return result;
	}
	
	/**
	 * 선택한 조건에 해당되는 사용실적을 가져온다.
	 * 
	 * @param params 파라미터 맵
	 * 			place1 - 기관코드 or 점검, year - 대상 연도, quater - 대상 분기
	 * @return 리턴값 설명
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public List<HashMap<String, Object>> getEquipUseStateInfo(EquipSearchVO searchVO) throws Exception {
		List<HashMap<String, Object>> result = null;
		result = equipmentMapper.getEquipUseStateInfo(searchVO);
		return result;
	}

	/**
	 * 사용실적을 입력 or 수정한다.
	 * 
	 * @param paramMap 장비별 실적 리스트
	 * @return 결과 데이터를 담은 map 리스트
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	@Transactional
	public int insertEquipUseState(final EquipSearchVO searchVO, final HashMap<String, HashMap<String, Object>> paramMap) throws Exception {
		int success = 0; 
		
		Set<String> keySet = paramMap.keySet();
		Iterator<String> it = keySet.iterator();
		while (it.hasNext()) {
			HashMap<String, Object> value = paramMap.get(it.next());
			HashMap<String, Object> record = equipmentMapper.getEquipUseStateInfoByCode(value);
			boolean isInsert = record == null;
			
			if (isInsert) {
				success = equipmentMapper.insertEquipUseState(value);
			} else {
				success = equipmentMapper.updateEquipUseState(value);
			}
			
			if (success != 1) {
				throw new Exception();
			}
		}
		return success;
	};
	
	/**
	 * 외사장비 목록 조회
	 * 
	 * @param  arrestSearchVO 
	 * @return 외사장비목록 반환
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public List<EquipVO> getEquipList(final EquipSearchVO EquipSearchVO) throws Exception {
		
		return equipmentMapper.getEquipList(EquipSearchVO);		
	}
	
	/**
	 * 외사장비 목록 조회
	 * 
	 * @param  arrestSearchVO 
	 * @return 외사장비단건 반환
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public EquipVO getEquipment(final EquipVO equipVO) throws Exception {
		
		return equipmentMapper.getEquipment(equipVO);		
	}
	
	/**
	 * 외사장비 등록
	 * 
	 * @param  equipVO 
	 * @return 외사장비목록 반환
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public HashMap<String, Object> insertEquipment(final EquipVO equipVO, final Map<String, MultipartFile> fileMap) throws Exception {
		HashMap<String, Object> map = new HashMap<String, Object>();
		try{
			
			
			/* 파일 업로드 */
			//BoardFileVO boardFileVO = BoardVOHandler.getBFileVO("EQUIPMENT", serNo, 0);	
			//result = boardFileService.insertAndSaveFiles(boardFileVO, fileMap);
			
			
			
			
			if (fileMap != null && fileMap.get("file1").getSize() > 0) {
				String fileName1 = fileUploadUtil.uploadWithExt(fileMap.get("file1"), EQUIP_SAVE_PATH);
				System.out.println("fileName1 : " + fileName1);
				equipVO.setFileName1(fileName1);
			}
			if (fileMap != null && fileMap.get("file2").getSize() > 0) {
				String fileName2 = fileUploadUtil.uploadWithExt(fileMap.get("file2"), EQUIP_SAVE_PATH);
				equipVO.setFileName2(fileName2);
			}
			if (fileMap != null && fileMap.get("file3").getSize() > 0) {
				String fileName3 = fileUploadUtil.uploadWithExt(fileMap.get("file3"), EQUIP_SAVE_PATH);
				equipVO.setFileName3(fileName3);
			}
			
			map = equipmentMapper.insertEquipment(equipVO);
			
			if ((Integer)map.get("result") != 1) {
				throw new Exception();
			} else {
				map.put("result", 1);
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}
		
		return map;		
	}
	
	
	
	/**
	 * 외사장비 삭제 
	 * 
	 * @param  equipVO 
	 * @return 처리결과 반환
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public HashMap<String, Object> deleteEquipment(final EquipVO equipVO) throws Exception {
		try{
			/* 파일을 삭제한다. */
			//boardFileService.deleteAndRemoveFiles(BoardVOHandler.getBFileVO(boardVO)(equipVO));
		}catch(Exception e){
			
		}
		return equipmentMapper.deleteEquipment(equipVO);		
	}
	
	/**
	 * 외사장비 수정
	 * 
	 * @param  equipVO 
	 * @return 처리결과 반환
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public HashMap<String, Object> updateEquipment(final EquipVO dataVO, final Map<String, MultipartFile> fileMap, final String[] deleteFiles) throws Exception {
		
		HashMap<String, Object> map = new HashMap<String, Object>();
		
		try{
			System.out.println(deleteFiles);
			
			
			if( deleteFiles != null ){
				for (int i = 0; i < deleteFiles.length; i++) {
					if( deleteFiles[i].equals("1") ){
						if (dataVO.getFileName1() != null || dataVO.getFileName1().equals("")) {
							fileMngUtil.deleteFile(dataVO.getFileName1(), EQUIP_SAVE_PATH);
							dataVO.setFileName1(null);
						}
					}else if( deleteFiles[i].equals("2") ){
						// file2 삭제
						if (dataVO.getFileName2() != null || dataVO.getFileName2().equals("")) {
							fileMngUtil.deleteFile(dataVO.getFileName2(), EQUIP_SAVE_PATH);
							dataVO.setFileName2(null);
						}
					}else if( deleteFiles[i].equals("3") ){						
						// file3 삭제
						if (dataVO.getFileName3() != null || dataVO.getFileName2().equals("")) {
							fileMngUtil.deleteFile(dataVO.getFileName2(), EQUIP_SAVE_PATH);
							dataVO.setFileName3(null);
						}
					}
				}
			}
			
			if( fileMap != null ){
				if ( fileMap.get("file1") != null ) {
					if( fileMap.get("file1").getSize() > 0){
						String fileName1 = fileUploadUtil.uploadWithExt(fileMap.get("file1"), EQUIP_SAVE_PATH);
						System.out.println("fileName1 : " + fileName1);
						dataVO.setFileName1(fileName1);
					}
				}
				
				if ( fileMap.get("file2") != null ) {
					if( fileMap.get("file2").getSize() > 0){
						String fileName2 = fileUploadUtil.uploadWithExt(fileMap.get("file2"), EQUIP_SAVE_PATH);
						dataVO.setFileName2(fileName2);
					}
				}
				if ( fileMap.get("file3") != null ) {
					if( fileMap.get("file3").getSize() > 0){
						String fileName3 = fileUploadUtil.uploadWithExt(fileMap.get("file3"), EQUIP_SAVE_PATH);
						dataVO.setFileName3(fileName3);
					}
				}
				
			}
			
			
			
			map = equipmentMapper.updateEquipment(dataVO);
			
			if ((Integer)map.get("result") != 1) {
				throw new Exception();
			} else {
				map.put("result", 1);
			}
			
		}catch(Exception e){
			
			
		}
		
		return map;		
	}
}
