package itn.let.mjo.block.web;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import itn.com.cmm.JsonResult;
import itn.com.cmm.LoginVO;
import itn.com.cmm.util.StringUtil;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.mjo.block.service.MjonBlockService;
import itn.let.mjo.block.service.MjonBlockVO;
import itn.let.mjo.msg.service.MjonMsgService;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.mjo.msgdata.service.PhoneVO;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uss.umt.service.MberManageVO;

/**
 * 주소록 수신거부 관한 controller 클래스를 정의한다.
 * @author ITN
 * @since 2022.03.17
 * @version 1.0
 * @see
 *
 * <pre>
 * << 개정이력(Modification Information) >>
 *
 *   수정일      수정자           수정내용
 *  -------    --------    ---------------------------
 *   2022.03.17  ITN          최초 생성
 *
 * </pre>
 */
@Controller
public class AddrBlockController {

	@Resource(name = "mjonBlockService")
	private MjonBlockService mjonBlockService;
	
	@Resource(name = "mjonMsgService")
    private MjonMsgService mjonMsgService;
	
	@Resource(name = "MjonMsgDataService")
    private MjonMsgDataService mjonMsgDataService;
	
	//배열 정의{"컬럼순차번호, 컬럼이름, 컬럼내용, 컬럼이름에 붙여야할 내용(엑셀코드양식다운로드시 필요)"}
	private String[][] sendBlockExcelValue ={
	    {"0" ,"번호" , "1" , "" },
	    {"1", "형태" , "직접등록" , ""}, 
	    {"2", "거부번호" , "01012345678", ""}, 
	    {"3", "수신자" , "홍길동", ""}, 
	    {"4", "등록일시" , "2021-06-08 11:05:38", ""},
	    {"5", "메모" , "테스트", ""}
	} ;	
	
	/**
	 * 주소록 수신거부 관리 이동
	 * 
	 * @param addrVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
    @RequestMapping(value= {"/web/mjon/addrBlock/selectBlockList.do" , 
			"/web/mjon/addrBlock/selectBlockAllAjax.do",
			"/web/mjon/addrBlock/selectBlock080Ajax.do",
			"/web/mjon/addrBlock/selectBlockSelfAjax.do"
			})	
	public String selectBlockList(@ModelAttribute("searchVO") MjonBlockVO blockVO
			, HttpServletRequest request
			, RedirectAttributes redirectAttributes
			, ModelMap model) throws Exception {
		
    	String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
		//로그인 권한정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	String userName = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName());

		if(userId == "") {
			redirectAttributes.addFlashAttribute("message", "수신거부 서비스는 로그인 후 이용 가능합니다.");
			return "redirect:/web/user/login/login.do";
		}
    	
		// 현재 날짜 구하기
		LocalDate now = LocalDate.now();
		// 포맷 정의
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
		// 포맷 적용
		String formatedNow = now.format(formatter);

		model.addAttribute("userName", userName);	
		model.addAttribute("nowDate", formatedNow);
		
		if(userId != "") {
			blockVO.setUserId(userId);
		} 
		
		if(blockVO.getPageUnit() != 10) {
			blockVO.setPageUnit(blockVO.getPageUnit());
		}
		
    	if(pattern.equals("/web/mjon/addrBlock/selectBlockAllAjax.do")
    			|| pattern.equals("/web/mjon/addrBlock/selectBlock080Ajax.do")
    			|| pattern.equals("/web/mjon/addrBlock/selectBlockSelfAjax.do")
    		) { //전체 , 080, 자체		
    		
			/** paging */
			PaginationInfo paginationInfo = new PaginationInfo();
			paginationInfo.setCurrentPageNo(blockVO.getPageIndex());
			paginationInfo.setRecordCountPerPage(blockVO.getPageUnit());
			paginationInfo.setPageSize(blockVO.getPageSize());
			
			blockVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
			blockVO.setLastIndex(paginationInfo.getLastRecordIndex());
			blockVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
			
			if("".equals(blockVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
				blockVO.setSearchSortCnd("blockId");
				blockVO.setSearchSortOrd("desc");
			}
			
			// 수신거부형태 (1: 080 자동수신거부, 2: 직접등록)
	    	if(pattern.equals("/web/mjon/addrBlock/selectBlock080Ajax.do")) {
	    		blockVO.setBlockType(1);	
	    	}
			else if(pattern.equals("/web/mjon/addrBlock/selectBlockSelfAjax.do")) {
				blockVO.setBlockType(2);
			}
			
			List<MjonBlockVO> blockList = mjonBlockService.selectBlockList(blockVO);
			int totCnt = 0;
			
			 if(blockList.size() > 0) {
					totCnt = blockList.get(0).getTotCnt();
				}
			 
			model.addAttribute("resultList", blockList);
			paginationInfo.setTotalRecordCount(totCnt);
			model.addAttribute("paginationInfo", paginationInfo);
			
	    	if(pattern.equals("/web/mjon/addrBlock/selectBlock080Ajax.do")) {
	    		return "/web/addrBlock/AddrBlock080Ajax";	
	    	}			
	    	else if(pattern.equals("/web/mjon/addrBlock/selectBlockSelfAjax.do")) {
				return "/web/addrBlock/AddrBlockSelfAjax";
			}
			else {
				return "/web/addrBlock/AddrBlockAllAjax";
			}
    	}
    	
		
		return "/web/addrBlock/AddrBlockList";
	}	

    /**
     * 수신거부 저장
     * @param searchVO
     * @param model
     * @return	"/web/mjon/addrBlock/addrBlockInsertAjax.do"
     * @throws Exception
     */
	@RequestMapping(value= {"/web/mjon/addrBlock/addrBlockInsertAjax.do"})
	public ModelAndView addrBlockInsertAjax(@ModelAttribute("searchVO") MjonBlockVO mjonBlockVO, 
			RedirectAttributes redirectAttributes, 
			ModelMap model) throws Exception{
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		boolean isSuccess = true;
		String msg = "";
		
		try {
			
			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
	    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
	    	
        	if(userId.equals("")) {
        		isSuccess = false;
    			modelAndView.addObject("isSuccess", isSuccess);        		
        		modelAndView.addObject("msg", "로그인 후 이용이 가능합니다.");
    			return modelAndView;
        	}
        	else {
        		mjonBlockVO.setUserId(userId);
        	}
        	
        	
        	//치환문자 체크 처리
        	//String[] phoneList = mjonBlockVO.getPhoneList();
        	//String[] nameList = mjonBlockVO.getNameList();
        	//String[] memoList = mjonBlockVO.getMemoList();
       	
    		mjonBlockVO.setBlockType(2);	// 직접등록
        	mjonBlockService.insertBlockList(mjonBlockVO);
    	}
		catch(Exception e) {
			isSuccess = false;
    		msg = e.getMessage();

    	}
			
		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);

		return modelAndView;
	}    
    
    /**
     * 수신거부 삭제
     * @param searchVO
     * @param model
     * @return	"/web/mjon/addrBlock/addrBlockDeleteAjax.do"
     * @throws Exception
     */
	@RequestMapping(value= {"/web/mjon/addrBlock/addrBlockDeleteAjax.do"})
	public ModelAndView addrBlockDeleteAjax(@ModelAttribute("searchVO") MjonBlockVO mjonBlockVO, 
			RedirectAttributes redirectAttributes, 
			@RequestParam String[] blockCheckList, 
			ModelMap model) throws Exception{
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		boolean isSuccess = true;
		String msg = "";
		
		try {
			
			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
	    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
	    	
        	if(userId.equals("")) {
        		isSuccess = false;
    			modelAndView.addObject("isSuccess", isSuccess);        		
        		modelAndView.addObject("msg", "로그인 후 이용이 가능합니다.");
    			return modelAndView;
        	}
        	else {
        		mjonBlockVO.setUserId(userId);
        	}
        	
    		for(String id:blockCheckList) {
   				mjonBlockVO.setBlockId(id);
   				mjonBlockService.deleteBlock(mjonBlockVO);
    		}
    	}
		catch(Exception e) {
			isSuccess = false;
    		msg = e.getMessage();

    	}
			
		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);

		return modelAndView;
	}    	
    
    /**
     * 주소록 삭제
     * @param searchVO
     * @param model
     * @return	"/web/mjon/addrBlock/addrBlockAddrDeleteAjax.do"
     * @throws Exception
     */
	@RequestMapping(value= {"/web/mjon/addrBlock/addrBlockAddrDeleteAjax.do"})
	public ModelAndView addrBlockAddrDeleteAjax(@ModelAttribute("searchVO") MjonBlockVO mjonBlockVO, 
			RedirectAttributes redirectAttributes, 
			@RequestParam(value="blockCheck", defaultValue="0") String[] blockCheck, 
			ModelMap model) throws Exception{
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		boolean isSuccess = true;
		String msg = "";
		
		try {
			
			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
	    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
	    	
        	if(userId.equals("")) {
        		isSuccess = false;
    			modelAndView.addObject("isSuccess", isSuccess);        		
        		modelAndView.addObject("msg", "로그인 후 이용이 가능합니다.");
    			return modelAndView;
        	}
        	else {
        		mjonBlockVO.setUserId(userId);
        	}
        	
    		for(String id:blockCheck) {
   				mjonBlockVO.setBlockId(id);
   				mjonBlockService.deleteBlockAddr(mjonBlockVO);
    		}
    	}
		catch(Exception e) {
			isSuccess = false;
    		msg = e.getMessage();

    	}
			
		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);

		return modelAndView;
	}    		
	
	
    /**
     * 수신거부 메모 업데이트
     * @param searchVO
     * @param model
     * @return	"/web/mjon/addrBlock/addrBlockUpdateMemoAjax.do"
     * @throws Exception
     */
	@RequestMapping(value= {"/web/mjon/addrBlock/addrBlockUpdateMemoAjax.do"})
	public ModelAndView addrBlockUpdateMemoAjax(@ModelAttribute("searchVO") MjonBlockVO mjonBlockVO, 
			RedirectAttributes redirectAttributes, 
			@RequestParam(value="blockCheck", defaultValue="0") String[] blockCheck, 
			ModelMap model) throws Exception{
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		boolean isSuccess = true;
		String msg = "";
		
		try {
			
			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
	    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
	    	
        	if(userId.equals("")) {
        		isSuccess = false;
    			modelAndView.addObject("isSuccess", isSuccess);        		
        		modelAndView.addObject("msg", "로그인 후 이용이 가능합니다.");
    			return modelAndView;
        	}
        	else {
        		mjonBlockVO.setUserId(userId);
        	}
        	
        	// 메모 수정
			mjonBlockService.updateBlockMemo(mjonBlockVO);

    	}
		catch(Exception e) {
			isSuccess = false;
    		msg = e.getMessage();

    	}
			
		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);

		return modelAndView;
	}    		
	
	
    /**
     * 수신거부 결과전송 업데이트
     * @param searchVO
     * @param model
     * @return	"/web/mjon/addrBlock/addrBlockUpdateResultAjax.do"
     * @throws Exception
     */
	@RequestMapping(value= {"/web/mjon/addrBlock/addrBlockUpdateResultAjax.do"})
	public ModelAndView addrBlockUpdateResultAjax(@ModelAttribute("searchVO") MjonBlockVO mjonBlockVO, 
			RedirectAttributes redirectAttributes, 
			HttpServletRequest request,
			ModelMap model) throws Exception{
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		boolean isSuccess = true;
		String msg = "";
		
		try {
			String blockId = request.getParameter("blockId");
			mjonBlockVO.setBlockId(blockId);
			mjonBlockVO = mjonBlockService.selectAddrBlockDetail(mjonBlockVO);
			
			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
	    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
	    	String userName = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName());
	    	String mobile = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getMoblphonNo());
	    	
        	if(userId.equals("")) {
        		isSuccess = false;
    			modelAndView.addObject("isSuccess", isSuccess);        		
        		modelAndView.addObject("msg", "로그인 후 이용이 가능합니다.");
    			return modelAndView;
        	}
        	else {
        		mjonBlockVO.setUserId(userId);
        	}
        	
        	// Step1. 문자발송
        	String[] phones = {mjonBlockVO.getPhone()};
    		Map<String, Object> mapInfo = new HashMap<String, Object>();
    		mapInfo = sendMsgData(userId, userName, mobile, phones);
    		isSuccess = Boolean.parseBoolean((mapInfo.get("IsSuccess").toString()));
    		msg = mapInfo.get("Msg").toString();
    		
    		System.out.println("isSuccess : " + isSuccess);
    		
    		if (isSuccess == true) {
            	// Step2. 수신거부 결과전송 업데이트
    			mjonBlockService.updateBlockResult(mjonBlockVO);
    		}
    	}
		catch(Exception e) {
			isSuccess = false;
    		msg = e.getMessage();
    	}
			
		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);

		return modelAndView;
	}    	
	
	// 문자발송
	public Map<String, Object> sendMsgData(String userId, String userName, String mobile, String[] phones) throws Exception{
		boolean isSuccess = true;
		String msg = "문자 전송이 완료되었습니다.";

		Date nowDate = new Date(); 
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd");
		SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");

		String smsTxt = "문자온" + System.lineSeparator() + "	전송자 : " + userName + System.lineSeparator() + "수신거부일자 : " + simpleDateFormat.format(nowDate) + System.lineSeparator() + "처리결과 : 수신거부 완료";
		
		MjonMsgVO mjonMsgVO = new MjonMsgVO();
		//개별문자 가격 및 총 금액 셋팅해주기 - 시스템 기본 단가기준으로 입력해줌
		//1.시스템 기본 단가 정보 불러오기
		JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
		
		//2.사용자 개인 단가 정보 불러오기
		MberManageVO mberManageVO = new MberManageVO(); 

		float shortPrice = 0;
		if(!userId.equals("")) {
			mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);

			//3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용
			shortPrice = mberManageVO.getShortPrice();
		}
		
		if(shortPrice < 1) {
			shortPrice = sysJoinSetVO.getShortPrice();
		}		
		
		mjonMsgVO.setTotPrice(Float.toString(shortPrice));
		mjonMsgVO.setEachPrice(Float.toString(shortPrice));
		mjonMsgVO.setFileCnt("0");
		mjonMsgVO.setCurState("3");
		mjonMsgVO.setReserveYn("N");		// 즉시 전송
		mjonMsgVO.setMsgGroupCnt("0");
		mjonMsgVO.setUserId(userId);
		mjonMsgVO.setMsgType("4");		// 단문전송
		mjonMsgVO.setMsgKind("N");		// 일반
		mjonMsgVO.setMsgPayCode("SMS");
		mjonMsgVO.setCallToList(phones);
		mjonMsgVO.setCallFrom(mobile);
		mjonMsgVO.setReqDate(simpleDateFormat2.format(nowDate));	
		mjonMsgVO.setSmsTxt(smsTxt);
		
		try {
        	// 전송사 전송 배분
        	MjonMsgVO pramVO = new MjonMsgVO();
        	List<MjonMsgVO> sendRateList = mjonMsgService.selectTodayAgentSendCntList(pramVO); // 전송사 전송 배분률 및 현재 전송건수 조회
        	for (MjonMsgVO tmpVO : sendRateList) {
        		float cnt = Float.parseFloat(tmpVO.getMsgGroupCnt());
        		float totCnt = tmpVO.getTotCnt();
        		tmpVO.setSendRateInfo(Float.parseFloat(tmpVO.getSendRate()) - (cnt / totCnt * 100)); // 배분률 - 현재전송 비율
        	}
        	
        	String sendAgent = sendRateList.get(0).getAgentCode();
        	float maxRate = sendRateList.get(0).getSendRateInfo();
        	for (MjonMsgVO tmpVO : sendRateList) { // 배분률 대비 현재전송 비율이 가장 적은거 찾기
        		if (maxRate < tmpVO.getSendRateInfo()) {
        			maxRate = tmpVO.getSendRateInfo();
        			sendAgent = tmpVO.getAgentCode();
        		}
        	}
        	
        	//전송사 구분 코드  - 01 : 아이하트, 02 : 현대 퓨쳐넷, 03 : 아이엠오
        	//mjonMsgVO.setAgentCode("01");
        	// 하드코딩
        	//sendAgent = "02";
        	mjonMsgVO.setAgentCode(sendAgent);
        	
        	if(mjonMsgVO.getAgentCode().equals("03")) {	//아이엠오 전송사 문자 타입 설정해 주기
        		
        		// 단순 장문 문자는 neoType : 2, 그림 포함 : 4
        		if(mjonMsgVO.getFileCnt().equals("0")) { // 단순 장문 문자
        			
        			mjonMsgVO.setNeoType("2");
        			
        		}else{ // 그림포함 문자인경우
        			
        			mjonMsgVO.setNeoType("4");
        			
        		}
        		
        	}
        	
        	//현재 고객의 보유 캐시가 문자 발송이 가능한 금액인지 체크
        	String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
        	String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO);
        	mjonMsgVO.setBefPoint(userPoint); //현재 보유 포인트 정보 저장
        	String totPrice = mjonMsgVO.getTotPrice();

        	BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
        	BigDecimal totMsgPrice = new BigDecimal(totPrice).setScale(2, RoundingMode.HALF_EVEN);
        	
        	//현재 보유 금액이 발송 문자 총 금액보다 클 경우만 문자 발송
        	//BigDecimal 비교 연산
        	// befCash(현재 보유금액) 값이 totMsgPrice(문자전송 금액) 보다 많으면 문자 전송	
        	if(befCash.compareTo(totMsgPrice) == 1) { // -1 : befCash > totMsgPrice, 0 : befCash = totMsgPrice, 1 : befCash < totMsgPrice,
        		//문자 발송 처리
        		mjonMsgDataService.insertMsgDataByBlockInfo(mjonMsgVO);
        	}
        	else {
        		isSuccess = false;
        		msg = "문자 발송에 필요한 보유 잔액이 부족 합니다.";
        	}
    	}
		catch(Exception e) {
    		isSuccess = false;
    		msg = "기타 시스템 오류 : " + e.getMessage();
    	}
		
		Map<String, Object> mapInfo = new HashMap<String, Object>();
		mapInfo.put("IsSuccess", isSuccess);
		mapInfo.put("Msg", msg);
		
		return mapInfo;
	}
	
	
	
	/**
	 * 주소록 수신거부 - 엑셀파일 불러오기
	 * @param body
	 * @param uploadFile
	 * @param search
	 * @param result
	 * @param model
	 * @param request
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/web/mjon/addrBlock/sendExelFilePhoneNumAjax.do")
	@ResponseBody
	public Object sendExelFilePhoneNumAjax(final MultipartHttpServletRequest multiRequest) throws Exception {
		
		JsonResult jr = new JsonResult();
		jr.setSuccess(false);
		jr.setMessage("엑셀 파일만 업로드할 수 있습니다.");
		
		//final Map<String, MultipartFile> files = multiRequest.getFileMap();
		List<MultipartFile> files = (List<MultipartFile>) multiRequest.getFiles("file0");
		
		// 파일명에 .이 있을경우 오류 => Ex) 테스트6.20.xlsx 
		int fileNameSplitCnt = 0;
		
		if(!files.isEmpty()) {
			fileNameSplitCnt = files.get(0).getOriginalFilename().split("[.]").length;
			
			if (files.get(0).getSize() > 0 
					&& (files.get(0).getContentType().indexOf("spreadsheetml") > -1) 
					|| files.get(0).getContentType().indexOf("ms-excel") > -1 
					|| files.get(0).getOriginalFilename().split("[.]")[fileNameSplitCnt-1].indexOf("xlsx") > -1 
					|| files.get(0).getOriginalFilename().split("[.]")[fileNameSplitCnt-1].indexOf("xls") > -1) {
				
				// 엑셀 파일 용량 3MB이상 시 10만건 이상으로 서버가 다운되는 증상 발생
				long fileSize = multiRequest.getFile("file0").getSize();
				
				if(fileSize > 3374653) {
					jr.setMessage("엑셀 파일은 3MB를 넘을수 없습니다.");
					return jr;
				}
				
				String Ext = files.get(0).getOriginalFilename().split("[.]")[1];
				String errMessage = "";
		        String cellValue  = "";
		        
				//String phoneRegExp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$";
				String phoneRegExp = "^(050[234567]{1}|01[016789]{1})-?[0-9]{3,4}-?[0-9]{4}$";
				
	            int errPhoneCnt = 0;
		        
	            //엑셀 확장자에 따른 처리 로직 분리
				if(Ext.equals("xls")) {
					
					HSSFWorkbook workbook = new HSSFWorkbook(files.get(0).getInputStream());
				    HSSFSheet sheet = workbook.getSheetAt(0);
				    
				    if(sheet.getLastRowNum() > 20000) { //
		            	errMessage = "20000건 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.";
		            	jr.setSuccess(false);
		            	jr.setMessage(errMessage);
		            	return jr;
		            }
		            
		            List<HashMap<String, String>> json = new ArrayList<HashMap<String, String>>();
		            PhoneVO pVO = new PhoneVO();
		            for(int i=2; i< sheet.getLastRowNum() + 2; i++){ //먼저 밸리데이션 체크(1줄은 생략)
		            	HSSFRow row = sheet.getRow(i); //열읽기
		            	if(null == row) { 
		                    continue;
		                }
		            	
		            	HashMap<String, String> jm = new HashMap<>();
		            	// 행의 두번째 열(핸드폰부터 받아오기) 
		                HSSFCell cell = null;
		                for(int j = 0 ; j < 3; j++){ //행읽기(6행까지나 2행까지만 필요)
		                	cellValue = "";
		                	cell = row.getCell(j); //핸드폰/이름/메모

		                	if(null == cell || "".equals(cell.toString().trim())) { //셀에 값이 없으면  
		                		if(j == 1) {
			                		if (sheet.getLastRowNum() == i) {
			                			continue;
			                		}
			                		
			                		//errPhoneCnt++;
			                		//errSts = false;
			    	            	break;
		                		}
		                    }
		                	if(null != cell){
		                		switch(cell.getCellType()){ //숫자타임을 문자로 변환
		                			case  Cell.CELL_TYPE_NUMERIC:
		                			cell.setCellType(Cell.CELL_TYPE_STRING);
		                		}
		                		cellValue =  StringUtil.getString(cell.getStringCellValue().trim()) ;
		                    }

		                	if(j == 0) {
		                		//이름
		                		jm.put("name", cellValue);
		                	}
		                	if(j == 1) {
		                		//전화번호
		                		if(cellValue.matches(phoneRegExp)) {
		                			jm.put("phone", cellValue);
		                		}else {
			    	            	errPhoneCnt++;
		                		}
		                	} 
		                	if(j == 2) {
		                		//메모
		                		jm.put("memo", cellValue);
		                	}
		                	
		                }
		                if(null != jm.get("phone")) {
		                	json.add(jm);
		                }
		                
		            }
		            
		            jr.setData(json);
					jr.setSuccess(true);
					if(errPhoneCnt > 0) {
						jr.setMessage("올바르지 않은 휴대폰 번호가 "+ errPhoneCnt +" 건 있습니다.");
					}else {
						jr.setMessage("");
					}
					
				}else {	//확장자가 xlsx
					
					OPCPackage opcPackage = OPCPackage.open(files.get(0).getInputStream());
					XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);
		            XSSFSheet sheet = workbook.getSheetAt(0); // 첫번째 시트 불러오기
		            opcPackage.close();
		            
		            if(sheet.getLastRowNum() > 20000) { //
		            	errMessage = "20000건 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.";
		            	jr.setSuccess(false);
		            	jr.setMessage(errMessage);
		            	return jr;
		            }
		            
		            List<HashMap<String, String>> json = new ArrayList<HashMap<String, String>>();
		            PhoneVO pVO = new PhoneVO();
		            for(int i=2; i< sheet.getLastRowNum() + 2; i++){ //먼저 밸리데이션 체크(1줄은 생략)
		            	XSSFRow row = sheet.getRow(i); //열읽기
		            	if(null == row) { 
		                    continue;
		                }
		            	
		            	HashMap<String, String> jm = new HashMap<>();
		            	// 행의 두번째 열(핸드폰부터 받아오기) 
		                XSSFCell cell = null;
		                for(int j = 0 ; j < 3; j++){ //행읽기(6행까지나 2행까지만 필요)
		                	cellValue = "";
		                	cell = row.getCell(j); //핸드폰/이름/메모
		                	// 핸드폰만 공백체크
		                	if(null == cell || "".equals(cell.toString().trim())) { //셀에 값이 없으면  
		                		if(j == 1) {
			                		if (sheet.getLastRowNum() == i) {
			                			continue;
			                		}
			                		
			                		//errPhoneCnt++;
			                		//errSts = false;
			    	            	break;
		                		}
		                    }
		                	if(null != cell){
		                		switch(cell.getCellType()){ //숫자타임을 문자로 변환
		                			case  Cell.CELL_TYPE_NUMERIC:
		                			cell.setCellType(Cell.CELL_TYPE_STRING);
		                		}
		                		cellValue =  StringUtil.getString(cell.getStringCellValue().trim()) ;
		                    }

		                	if(j == 0) {
		                		//이름
		                		jm.put("name", cellValue);
		                	}		                	
		                	if(j == 1) {
		                		//전화번호
		                		if(cellValue.matches(phoneRegExp)) {
		                			jm.put("phone", cellValue);
		                		}else {
			    	            	errPhoneCnt++;
		                		}
		                	} 
		                	if(j == 2) {
		                		//메모
		                		jm.put("memo", cellValue);
		                	}
		                	
		                }
		                if(null != jm.get("phone")) {
		                	json.add(jm);
		                }
		                
		            }
		            
		            jr.setData(json);
					jr.setSuccess(true);
					if(errPhoneCnt > 0) {
						jr.setMessage("올바르지 않은 휴대폰 번호가 "+ errPhoneCnt +" 건 있습니다.");
					}else {
						jr.setMessage("");
					}
				}	//xlsx 처리 끝
				
			}
			
		}
		
		return jr;
	}
	
	
	/**
	 * 주소록 수신거부 - TXT파일 불러오기
	 * @param body
	 * @param uploadFile
	 * @param search
	 * @param result
	 * @param model
	 * @param request
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/web/mjon/addrBlock/sendTxtFilePhoneNumAjax.do")
	@ResponseBody
	public Object sendTxtFilePhoneNumAjax(final MultipartHttpServletRequest multiRequest) throws Exception {
		
		JsonResult jr = new JsonResult();
		jr.setSuccess(false);
		jr.setMessage("TXT 파일만 업로드할 수 있습니다.");
		
		List<MultipartFile> files = (List<MultipartFile>) multiRequest.getFiles("file0");
		
		if(!files.isEmpty()) {
			
			if (files.get(0).getSize() > 0 
					|| files.get(0).getOriginalFilename().split("[.]")[1].indexOf("txt") > -1) {
				
				// txt 파일 용량 3MB이상 시 10만건 이상으로 서버가 다운되는 증상 발생
				long fileSize = multiRequest.getFile("file0").getSize();
				
				if(fileSize > 3374653) {
					jr.setMessage("txt 파일은 3MB를 넘을수 없습니다.");
					return jr;
				}
				
				//Multi file to file 변환해주기
				File file = new File(files.get(0).getOriginalFilename());
				file.createNewFile();
				FileOutputStream fos = new FileOutputStream(file);
				fos.write(files.get(0).getBytes());
				fos.close();
				
				BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
				
				String line = null;
				String[] splitedStr = null;
				String[] tempStr = null;
				int errPhoneCnt = 0;

				//String phoneRegExp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$";
				String phoneRegExp = "^(050[234567]{1}|01[016789]{1})-?[0-9]{3,4}-?[0-9]{4}$";				
				
				List<HashMap<String, String>> json = new ArrayList<HashMap<String, String>>();
				
				//파일 읽어서 탭으로 구분해주기
				while ((line = reader.readLine()) != null) {

					HashMap<String, String> jm = new HashMap<>();
					splitedStr = null;
					tempStr = null;
					
					//txt 파일의 데이터가 탭 혹은 콤마로 구분되어 있는지 구분처리
					tempStr = line.split("\\,");
					if(tempStr.length > 1) {
						splitedStr = line.split("\\,");
					}else {
						splitedStr = line.split("\t");;
					}

					for (int i = 0; i < splitedStr.length; i++) {
						splitedStr[i] = splitedStr[i].trim();
						if(i == 0) {
							//이름
							jm.put("name", splitedStr[i]);							
						}
						if(i == 1) {
							if(splitedStr[i].matches(phoneRegExp)) {
								//휴대폰 번호
								jm.put("phone", splitedStr[i]);
							}else {
		    	            	errPhoneCnt++;
	                		}
						}
	                	if(i == 2) {
	                		//메모
	                		jm.put("memo", splitedStr[i]);
	                	}

					}
					
					if(jm.get("phone") != null) {
						json.add(jm);
					}

				} // end while
				jr.setData(json);
				jr.setSuccess(true);
				if(errPhoneCnt > 0) {
					jr.setMessage("올바르지 않은 휴대폰 번호가 "+ errPhoneCnt +" 건 있습니다.");
				}else {
					
					jr.setMessage("");
					
				}
			}
			
		}
		
		return jr;
	}
    
    //수신거부 엑셀 다운로드 
    @RequestMapping(value= {"/web/mjon/addrBlock/BlockExcelDownload.do"})
  	public void BlockExcelDownload( MjonBlockVO blockVO, 
			HttpServletRequest request,
			HttpServletResponse response ,
			ModelMap model) throws Exception {
  		
    	blockVO.setRecordCountPerPage(100000);
    	blockVO.setFirstIndex(0);
  		LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		//로그인 권한정보 불러오기
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		if(userId != "") {
			blockVO.setUserId(userId);
		} 		
  		
  		// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
  		SXSSFWorkbook wb = new SXSSFWorkbook(100);
  		CellStyle style = wb.createCellStyle();
  		style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 
   		style.setBorderLeft(CellStyle.BORDER_THIN);
   		style.setBorderRight(CellStyle.BORDER_THIN);
   		style.setBorderTop(CellStyle.BORDER_THIN);
   		Font font = wb.createFont();
   		font.setBoldweight(Font.BOLDWEIGHT_BOLD);  //글씨 bold
   		
  		Cell cell = null;
  		Row row = null;
  		
  		String fileName ="수신거부 엑셀 리스트";
  		
  		String sheetTitle = ""; 
  		try {
			if("".equals(blockVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
				blockVO.setSearchSortCnd("blockId");
				blockVO.setSearchSortOrd("desc");
			}
			
			// 수신거부형태 (1: 080 자동수신거부, 2: 직접등록)
			List<MjonBlockVO> resultList = mjonBlockService.selectBlockList(blockVO);

  			{ //화면 리스트
  				sheetTitle = "수신거부내역" ; //제목
  				Sheet sheet = wb.createSheet(sheetTitle);
  				row = sheet.createRow(0);
  		        for(int i=0 ; i < sendBlockExcelValue.length ; i++) {
  	 		       cell = row.createCell(i);
  	 		       cell.setCellStyle(style);
  		 	       cell.setCellValue(sendBlockExcelValue[i][1]);
  	 		    }
  			    
  		        for(int i=0; i <  resultList.size(); i++){
  			    	row = sheet.createRow(i+1);
  			    	for(int j=0 ; j < sendBlockExcelValue.length ; j++) {
  			        	cell = row.createCell(j);
  			        	cell.setCellStyle(style);
  			        	if(j==0) cell.setCellValue(i+1); //번호
  			        	if(j==1) cell.setCellValue(((MjonBlockVO)resultList.get(i)).getBlockTypeName()); //형태
  			        	if(j==2) cell.setCellValue(((MjonBlockVO)resultList.get(i)).getPhone()); //거부번호
  			        	if(j==3) cell.setCellValue(((MjonBlockVO)resultList.get(i)).getName()); //수신자
  			        	if(j==4) cell.setCellValue(((MjonBlockVO)resultList.get(i)).getRegDate()); //등록일시
  			        	if(j==5) cell.setCellValue(((MjonBlockVO)resultList.get(i)).getMemo()); //메모
  				 	}
  		        }
  			}
  	    response.setHeader("Set-Cookie", "fileDownload=true; path=/");
  		SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA );
  		Date currentTime = new Date ();
  		String mTime = mSimpleDateFormat.format ( currentTime );
  		fileName = fileName+"("+mTime+")";
  		
  		response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx"));
  		wb.write(response.getOutputStream());
  	    
  		}catch(Exception e) {
  			response.setHeader("Set-Cookie", "fileDownload=false; path=/");
  			response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  			response.setHeader("Content-Type","text/html; charset=utf-8");
  			OutputStream out = null;
  			try {
  				out = response.getOutputStream();
  				byte[] data = new String("fail..").getBytes();
  				out.write(data, 0, data.length);
  			} catch(Exception ignore) {
  				ignore.printStackTrace();
  			} finally {
  				if(out != null) try { out.close(); } catch(Exception ignore) {}
  			}
  		}finally {
  			// 디스크 적었던 임시파일을 제거합니다.
  			wb.dispose();
  			try { wb.close(); } catch(Exception ignore) {}
  		}
  	}	
    
}
