package com.dbs.mplus.service;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

public class MultiPartFileUtil {
	
	protected Logger logger = LoggerFactory.getLogger(this.getClass());
	
	private String surveyAdminPath = "C:\\dev\\workspace\\survey\\survey_admin";
	
	private String surveyImagesFoldername = "survey_images";
	
	public MultiPartFileUtil( String strAdminPath, String strImagesFoldername){
		surveyAdminPath = strAdminPath;
		surveyImagesFoldername = strImagesFoldername;	
	}
	
	/**
	 * 이미지 업로드를 처리, 이미치 파일을 저장 후, 저장 정보를 리턴
	 * @param request
	 * @return
	 * @throws SurveySqlException 
	 */
//	public String fileUploadSingle( HttpServletRequest request) throws Exception {
//		
//		String retPathName = "";
//
//		try{
//			// 저장 위치 : /survey_images/[svySeq]/[qstSeqNum]/000001.jpg]
//			// 20180109 이미지 저장 위치 관련 수정
//			String rootPath = request.getSession().getServletContext().getRealPath("/" + surveyImagesFoldername + "/");	// Context 내의 image 폴더를 사용하거나 Context alias가 적용된 경우
//			//String rootPath = surveyAdminPath + File.separator + surveyImagesFoldername;	// image path context를 따로 추가한 경우
//			String path = rootPath;
//
//			MultipartHttpServletRequest mhsr = (MultipartHttpServletRequest) request;
//			Iterator<String> iter = mhsr.getFileNames();
//			
//			MultipartFile mfile = null;
//			String fieldName = "";
//
//			// 디렉토리가 없다면 생성
//			File dir = new File(path);
//			if( !dir.isDirectory()) {
//				dir.mkdirs();
//			}
//			if( iter.hasNext()) {
//				fieldName = iter.next();
//				mfile = mhsr.getFile( fieldName);
//				String originalName = new String( mfile.getOriginalFilename().getBytes("8859_1"), "UTF-8");
//				
//				if( !"".equals( originalName)){
//					String ext = originalName.substring( originalName.lastIndexOf('.'));
//					// 20170810 jpg, gif, png, bmp 확장자 이미지만 처리하도록 함 
//					if( fileUploadCheckImage(ext))
//					{
//						String saveFileName = UUID.randomUUID().toString().replaceAll("-","") + ext;
//						
//						File serverFile = new File( path + File.separator + saveFileName);
//						mfile.transferTo( serverFile);
//						
//						// 저장된 이미지의 위치 리턴
//						retPathName = "/" + surveyImagesFoldername + "/" + saveFileName;
//					}
//				}
//			}
//			else
//			{
//				
//			}			
//		}catch( UnsupportedEncodingException e){
//			this.logger.error("UnsupportedEncodingException 발생 : 파일 업로드 오류 ", e);
//		}catch(IllegalStateException e){
//			this.logger.error("IllegalStateException 발생 : 파일 업로드 오류 ", e);
//		}catch(IOException e){
//			this.logger.error("IOException 발생 : 파일 업로드 오류 ", e);
//		}
//		
//		return retPathName;
//	}

	// 파일 확장자 체크
	public boolean fileUploadCheckImage(String fileName) {
		boolean ret = false;
		String check = fileName.substring(fileName.lastIndexOf("."));
		if (check.equalsIgnoreCase(".jpg") || check.equalsIgnoreCase(".bmp") || check.equalsIgnoreCase(".gif")
				|| check.equalsIgnoreCase(".png")) {
			ret = true;
		}
		return ret;
	}
	
	//다중 파일 업로드 샘플 예제
	public Map<String, Object> fileUpload( HttpServletRequest request) {
		
		// 저장 위치 : /resources/images/[svySeq]/[qstSeqNum]/000001.jpg]
		String rootPath = request.getSession().getServletContext().getRealPath("/") ;
		String imagesPath = "resources" + File.separator + "images";
		String path = rootPath + File.separator + imagesPath;
		
		Map<String, Object> returnObject = new HashMap<String, Object>();
		String strHospitalCd = request.getParameter("hospitalCd");
		this.logger.debug("inputWoundImg.json : fileUpload !!!!");
		this.logger.debug("hospitalCd : " + request.getParameter("hospitalCd"));
		this.logger.debug("userId : " + request.getParameter("userId"));
		this.logger.debug("patientId : " + request.getParameter("patientId"));
		this.logger.debug("deptCd : " + request.getParameter("deptCd"));
		this.logger.debug("doctorId : " + request.getParameter("doctorId"));
		this.logger.debug("searchCls : " + request.getParameter("searchCls"));
		this.logger.debug("excutionDtTm : " + request.getParameter("excutionDtTm"));
		
		try {

			MultipartHttpServletRequest mhsr = (MultipartHttpServletRequest) request;
			Iterator<String> iter = mhsr.getFileNames();
			
			MultipartFile mfile = null;
			String fieldName = "";
			List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
			
			// 디렉토리가 없다면 생성
			File dir = new File(path);
			if( !dir.isDirectory()) {
				dir.mkdirs();
			}
			
			while( iter.hasNext()) {
				fieldName = iter.next();
				mfile = mhsr.getFile( fieldName);
				String originalName = new String( mfile.getOriginalFilename().getBytes("8859_1"), "UTF-8");
				
				if( "".equals( originalName)){
					continue;
				}
				
				String ext = originalName.substring( originalName.lastIndexOf('.'));
				String saveFileName = UUID.randomUUID().toString().replaceAll("-","") + ext;
				
				File serverFile = new File( path + File.separator + saveFileName);
				mfile.transferTo( serverFile);
				
				Map<String, Object> file = new HashMap<String, Object>();
				file.put( "originalName", originalName);
				file.put( "sfile",  serverFile);
				resultList.add( file);						
			}
			
			//returnObject.put( "files",  resultList);
			//returnObject.put("params",  mhsr.getParameterMap());
			
			// 등록 성공인 경우( 받을 파일이 2개인 경우),
			if( resultList.size() == 2){
				returnObject.put( "hospitalCd",  strHospitalCd);
				returnObject.put( "returnCd",  "0000");
				returnObject.put( "returnMsg",  "success!!");
			} else {
				returnObject.put( "hospitalCd",  strHospitalCd);
				returnObject.put( "returnCd",  "0001");
				returnObject.put( "returnMsg",  "fail message!!");				
			}
			
		}catch( UnsupportedEncodingException e){
			e.printStackTrace();
			returnObject.put( "hospitalCd",  strHospitalCd);
			returnObject.put( "returnCd",  "0001");
			returnObject.put( "returnMsg",  "fail message!!");	
		}catch(IllegalStateException e){
			e.printStackTrace();
			returnObject.put( "hospitalCd",  strHospitalCd);
			returnObject.put( "returnCd",  "0001");
			returnObject.put( "returnMsg",  "fail message!!");	
		}catch(IOException e){
			e.printStackTrace();
			returnObject.put( "hospitalCd",  strHospitalCd);
			returnObject.put( "returnCd",  "0001");
			returnObject.put( "returnMsg",  "fail message!!");	
		}
		
		return returnObject;		
	}

}
