package itn.let.mjo.addragency.web;

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

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
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.EgovMessageSource;
import itn.com.cmm.LoginVO;
import itn.com.cmm.service.EgovFileMngService;
import itn.com.cmm.service.EgovFileMngUtil;
import itn.com.cmm.service.FileVO;
import itn.com.cmm.util.RedirectUrlMaker;
import itn.let.cop.bbs.service.Board;
import itn.let.cop.bbs.service.BoardMasterVO;
import itn.let.cop.bbs.service.EgovBBSAttributeManageService;
import itn.let.mjo.addr.service.AddrGroupService;
import itn.let.mjo.addr.service.AddrService;
import itn.let.mjo.addragency.service.AddrAgencyService;
import itn.let.mjo.addragency.service.AddrAgencyVO;
import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.sym.site.service.EgovSiteManagerService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.utl.sim.service.EgovClntInfo;
import itn.let.utl.user.service.CheckBoardUtil;
import itn.let.utl.user.service.CheckFileUtil;
import itn.let.utl.user.service.CheckLoginUtil;
import itn.let.utl.user.service.MjonNoticeSendUtil;

@Controller
public class AddrAgencyController {
	
/*
	@Resource(name = "MjonMsgSentService")
    private MjonMsgSentService mjonMsgSentService;

	@Resource(name = "EgovCmmUseService")
	private EgovCmmUseService cmmUseService;
	
	*/

    @Resource(name="addrAgencyService")
    private AddrAgencyService addrAgencyService;
    
    @Resource(name = "checkBoardUtil")
	private CheckBoardUtil checkBoardUtil;

	@Resource(name = "checkFileUtil")
	private CheckFileUtil checkFileUtil;
	
	@Resource(name = "checkLoginUtil")
	private CheckLoginUtil checkLoginUtil;
	
	@Resource(name = "EgovBBSAttributeManageService")
	private EgovBBSAttributeManageService bbsAttrbService;
	
    @Resource(name="egovMessageSource")
    EgovMessageSource egovMessageSource;
    
    @Resource(name="EgovFileMngUtil")
	private EgovFileMngUtil egovFileMngUtil;

    @Resource(name="EgovFileMngService")
    private EgovFileMngService fileMngService;
    
    @Resource(name="AddrService")
    private AddrService addrService;
    
    @Resource(name="AddrGroupService")
    private AddrGroupService addrGroupService;
	
    /** 알림전송 Util */
    @Resource(name = "mjonNoticeSendUtil")
    private MjonNoticeSendUtil mjonNoticeSendUtil;
    
	@Resource(name="MjonCommon")
	private MjonCommon mjonCommon;
	
	/** 사이트 설정 */ 
	@Resource(name = "egovSiteManagerService")
	EgovSiteManagerService egovSiteManagerService;
	
    private static final Logger logger = LoggerFactory.getLogger(AddrAgencyController.class);
 
    /////////////////////////////////////////////////////////////////////////////////////////
    //
    //
    //	USER
    //
    //

    /**
     * 주소록 입력 대행(무료) 등록 및 리스트 화면
     * @param addrVO
     * @param model
     * @return
     * @throws Exception
     */
        
    @RequestMapping(value= {"/web/mjon/addragency/selectAddrAgencyList.do"})    
    public String selectAddrAgencyListUser(
    		HttpServletRequest request
    		, @ModelAttribute("searchVO") AddrAgencyVO addrAgencyVO
    		, ModelMap model
    		, RedirectAttributes redirectAttributes
    		) throws Exception {    	
    	
    	
    	logger.debug("AddrAgencyController-selectAddrAgencyListUser");
    	
    	
    	//사용자 로그인 여부 체크    	
    	String isLogin = checkLoginUtil.isUserLogin4PageMove(redirectAttributes);
    	if (!"Y".equals(isLogin)) return isLogin;
    	
    	
    	//login 정보 전달
    	LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();    	
    	model.addAttribute("loginVO", loginVO);
    	
    	
    	//ajax를 위한 현재 URL 정보 전달
    	addrAgencyVO.setUrl(request.getRequestURI());
    	
    	
    	return "/web/addragency/AddrAgencyList";    	
    	
    }
    
    /**
     * 주소록 입력 대행(무료) 등록 리스트 ajax 부분
     * @param addrVO
     * @param model
     * @return
     * @throws Exception
     */
    
    @RequestMapping(value= {"/web/mjon/addragency/selectAddrAgencyListAjax.do"})
    public String selectAddrAgencyListAjax(
    		HttpServletRequest request
    		, @ModelAttribute("searchVO") AddrAgencyVO addrAgencyVO
    		, ModelMap model
    		, RedirectAttributes redirectAttributes
    		) throws Exception {

    	logger.debug("AddrAgencyController-selectAddrAgencyListAjax");
    	
    	//사용자 로그인 여부 체크
    	String isLogin = checkLoginUtil.isLoginCheck4JsonPage(redirectAttributes);
    	if (!"Y".equals(isLogin)) return "/web/mjon/addragency/selectAddrAgencyList";	//호출하는 base 페이지로 return 해야 한다.
    	
    	

    	//로그인 정보 획득
    	LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
    	
    	
    	// pageing step1
    	PaginationInfo paginationInfo = this.setPagingStep1(addrAgencyVO);

    	
    	// pageing step2
    	addrAgencyVO = this.setPagingStep2(addrAgencyVO, paginationInfo);
    	    	
    	
		//대상 리스트 가져오기    	    	
    	addrAgencyVO.setSiteNm(loginVO.getId());
    	List<AddrAgencyVO> addrList = addrAgencyService.selectList(addrAgencyVO);
    	
    	
    	// pageing step3
    	paginationInfo = this.setPagingStep3(addrList, paginationInfo);
   	
    	
    	//대상 리스트, 페이징 정보 전달
    	model.addAttribute("resultList", addrList);
    	model.addAttribute("paginationInfo", paginationInfo);
    	
		
    	return "/web/addragency/AddrAgencyListAjax";
    	
    }
    
	/**
	 * (사용자)게시물을 등록한다.
	 *
	 * @param boardVO
	 * @param board
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value= 
		{  
				"/web/mjon/addragency/insertAddrAgencyAjax.do"
				, "/uss/ion/addragency/insertAddrAgencyAjax.do"
				}
	)
	public ModelAndView insertAddrAgencyAjax(
			HttpServletRequest request
			, @ModelAttribute("insertAgency") AddrAgencyVO addrAgencyVO
			, final MultipartHttpServletRequest multiRequest
			, @ModelAttribute("board") Board board
			//, ModelMap model
			, ModelAndView modelAndView
			, RedirectAttributes redirectAttributes			 
			) throws Exception {

		logger.debug("AddrAgencyController-insertAddrAgencyAjax");
		
		//json 알림
		modelAndView.setViewName("jsonView");
				
		
    	//사용자 로그인 여부 체크 for json
    	String isLogin = checkLoginUtil.isLoginCheck4JsonAction(modelAndView);    	
    	if ("N".equals(isLogin)) return modelAndView;	
    	

    	//로그인 정보 획득
    	LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
    	    	
    	
    	//게시판 관리 정보 획득 및 사용 여부 체크		
		BoardMasterVO bmVO = checkBoardUtil.checkBoardUse(board.getBbsId(), modelAndView, bbsAttrbService);
		if (bmVO == null) return modelAndView;
				    	
    	
		//파일 정상 처리 여부와 첨부 파일 정보
		String atchFileId = this.takeFile(multiRequest, modelAndView, bmVO);		
		if ("ERROR".equals(atchFileId)) return modelAndView;
						
		
		//게시판 등록하기
		modelAndView = this.insertAddrAgencyBoard(modelAndView, atchFileId, addrAgencyVO, board.getNttCn(), loginVO.getId(), multiRequest);
				
		// 법인폰 알람여부 체크
		JoinSettingVO joinSettingVO = new JoinSettingVO();
		joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
		// 이메일 체크
		if (joinSettingVO != null && joinSettingVO.getEmailNoti().equals("Y")) {
			String emailTitle = "번호관리 > 주소록 입력대행 요청";

			// CS관리자 이메일 알림전송
			mjonNoticeSendUtil.csAdminEmailNoticeSend(loginVO.getName(), loginVO.getId(), emailTitle);		
		}

		// SMS 체크		
		if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) {
			String smsTitle = "주소록 입력대행 요청";
			
			// CS관리자 SMS 알림전송
			mjonNoticeSendUtil.csAdminSmsNoticeSend(loginVO.getId(), smsTitle);
		}

		// SLACK 체크
		if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {		
			// Slack 메시지 발송(단순본문)
			String msg = "[문자온] 주소록 입력대행 요청 - " + loginVO.getName() +"("+ loginVO.getId() + ")";
			mjonCommon.sendSimpleSlackMsg(msg);
		}
		
		return modelAndView;
	}
	
	/*
	 * 1.url 이동
	 * 2.ajax
	 * 	2-1.page call return htem
	 *  2-2.action call return success or fail
	 *  
	 * 1.
	 * 	a call b redirect c
	 * 
	 * 2-1.ajax call
	 * 	blank html
	 * 
	 * 2-2.
	 *  return fail 
	 *  
	 * */
    /////////////////////////////////////////////////////////////////////////////////////////
    //
    //
    //	ADMIN
    //
    //
    
    /**
     * 주소록 입력 대행(무료) 관리 화면
     * @param addrVO
     * @param model
     * @return
     * @throws Exception
     */
        
    @RequestMapping(value= {"/uss/ion/addragency/selectAddrAgencyList.do"})    
    public String selectAddrAgencyList(
    		HttpServletRequest request
    		, @ModelAttribute("searchVO") AddrAgencyVO addrAgencyVO
    		, ModelMap model
    		, RedirectAttributes redirectAttributes
    		) throws Exception {

    	logger.debug("AddrAgencyController-selectAddrAgencyList");
    	
    	//관리자 로그인 여부 체크
    	String isLogin = checkLoginUtil.isAdminLogin4PageMove(redirectAttributes);    	
    	if (!"Y".equals(isLogin)) return isLogin;
    	
    	
    	//로그인 정보 획득
    	LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
    	
    	
    	//login 정보
    	model.addAttribute("loginVO", loginVO);
    	
    	
    	//ajax를 위한 현재 URL 정보 받기
    	addrAgencyVO.setUrl(request.getRequestURI()); 
    	
    	
		return "/uss/ion/addragency/AddrAgencyList";    	
    	
    }
    
    /**
     * 주소록 입력 대행(무료) 관리 리스트 ajax 부분
     * @param addrVO
     * @param model
     * @return
     * @throws Exception
     */
    
    @RequestMapping(value= {"/uss/ion/addragency/selectAddrAgencyListAjax.do"})
    public String selectAddrAgencyListAjaxAdmin(
    		HttpServletRequest request
    		, @ModelAttribute("searchVO") AddrAgencyVO addrAgencyVO
    		, ModelMap model
    		, RedirectAttributes redirectAttributes
    		) throws Exception {
    	
    	logger.debug("AddrAgencyController-selectAddrAgencyListAjaxAdmin");
    	
    	//관리자 로그인 여부 체크
    	String isLogin = checkLoginUtil.isLoginCheck4JsonPage(redirectAttributes);    	
    	if ("N".equals(isLogin)) return "/uss/ion/addragency/AddrAgencyListAjax";   	
    	

    	// pageing step1
    	PaginationInfo paginationInfo = this.setPagingStep1(addrAgencyVO);

    	
    	// pageing step2
    	addrAgencyVO = this.setPagingStep2(addrAgencyVO, paginationInfo);
    	
    	
		//대상 리스트 가져오기
    	//관리자 리스트는 30일 마감에 대한 제한을 없애기 위해서 해당 값을 넣어준다.
    	addrAgencyVO.setSiteNm("ADMIN");
    	List<AddrAgencyVO> addrList = addrAgencyService.selectList(addrAgencyVO);
    	
    	
    	// pageing step3
    	paginationInfo = this.setPagingStep3(addrList, paginationInfo);
   	    	
		
    	//대상 리스트, 페이징 정보 전달
    	model.addAttribute("resultList", addrList);
    	model.addAttribute("paginationInfo", paginationInfo);
    	
    	
    	return "/uss/ion/addragency/AddrAgencyListAjax";
    	
    }
    
    /**
     * 발신/수신/거부 번호  등록/수정
     * @param searchVO
     * @param model
     * @return	"/uss/ion/msg/SendMsgModify"
     * @throws Exception
     */
    @RequestMapping(value = 
    	{"/uss/ion/addragency/AddrAgencyInsert.do"
    			
    			})
    public String AddrAgencyInsert(
            @ModelAttribute("searchVO") AddrAgencyVO searchVO 
            , HttpServletRequest request 
            , RedirectAttributes redirectAttributes
            , Model model) throws Exception {
    	
    	logger.debug("AddrAgencyController-AddrAgencyInsert");
    	
    	//관리자 로그인 여부 체크
    	String isLogin = checkLoginUtil.isAdminLogin4PageMove(redirectAttributes);    	
    	if (!"Y".equals(isLogin)) return isLogin;
    	
    	
    	//사용자 정보
    	LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();    	
    	model.addAttribute("loginVO", loginVO);
    	
		
        return "/uss/ion/addragency/AddrAgencyInsert";
    }
    

    /**
     * 발신/수신/거부 번호  등록/수정
     * @param searchVO
     * @param model
     * @return	"/uss/ion/msg/SendMsgModify"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/addragency/AddrAgencyModify.do"})
    public String AddrAgencyModify(
            @ModelAttribute("searchVO") AddrAgencyVO searchVO
            , HttpServletRequest request 
            , Model model
            , RedirectAttributes redirectAttributes
            ) throws Exception {
    	
    	logger.debug("AddrAgencyController-AddrAgencyModify");
    	
    	//관리자 로그인 여부 체크
    	String isLogin = checkLoginUtil.isAdminLogin4PageMove(redirectAttributes);    	
    	if (!"Y".equals(isLogin)) return isLogin;
    	
    	
    	//수정 대상 정보 가져오기
    	AddrAgencyVO addrAgencyVO = addrAgencyService.selectDetail(searchVO);
		model.addAttribute("AddrAgencyVO", addrAgencyVO);
		
		
        return "/uss/ion/addragency/AddrAgencyModify";
    }
    

	/**
	 * (관리자) 주소록 무료대행 엑셀업로드
	 *
	 * @param AddrAgencyVO
	 * @param board
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value= {"/uss/ion/addragency/updateAddrAgencyAjax.do"})
	public ModelAndView updateAddrAgencyAjax(
			HttpServletRequest request
			, @ModelAttribute("updateAgency") AddrAgencyVO addrAgencyVO
			, final MultipartHttpServletRequest multiRequest
			, @ModelAttribute("board") Board board
			//, ModelMap model
			, ModelAndView modelAndView
			, RedirectAttributes redirectAttributes			 
			) throws Exception {
		logger.debug("AddrAgencyController-updateAddrAgencyAjax");
		
		modelAndView.setViewName("jsonView");
		
		//사용자 로그인 여부 체크 for json
		LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		String isLogin = checkLoginUtil.isLoginCheck4JsonAction(modelAndView);    	
		if ("N".equals(isLogin)) return modelAndView;

		try {
			/*
			//1. 주소록 그룹 등록하기
			AddrGroupVO addrGroupVO = new AddrGroupVO();
			addrGroupVO.setMberId(addrAgencyVO.getRegisterId());
			addrGroupVO.setAddrGrpNm(addrAgencyVO.getAddrGrpNm());
			
			String addrNewGrpId = addrGroupService.insertAddrGroup(addrGroupVO);
			
			AddrVO addrVO = new AddrVO();
			//주소록 대행 신청자 아이디 SET
			addrVO.setMberId(addrAgencyVO.getRegisterId());
			addrVO.setFrstRegisterId(loginVO.getUniqId());
			//새로 생성한 그룹 아이디 SET
			addrVO.setAddrGrpId(addrNewGrpId);
			
			//2. 엑셀 업로드하기
			//final Map<String, MultipartFile> files = multiRequest.getFileMap();
			List<MultipartFile> files = (List<MultipartFile>) multiRequest.getFiles("file0");
			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(!files.isEmpty()) {
				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("[.]")[1].indexOf("xlsx") > -1 
						|| files.get(0).getOriginalFilename().split("[.]")[1].indexOf("xls") > -1) {
					
					String Ext = files.get(0).getOriginalFilename().split("[.]")[1];
					
					//엑셀 확장자에 따른 처리 로직 분리
					if(Ext.equals("xls")) {
						
						HSSFWorkbook workbook = new HSSFWorkbook(files.get(0).getInputStream());
						HSSFSheet sheet = workbook.getSheetAt(0);
						
						if(sheet.getLastRowNum() > 100000) { //
							errMessage = "100000줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.";
							modelAndView.addObject("errMessage", errMessage);
							modelAndView.addObject("result", "fail");
							return modelAndView;
						}
						
						
						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<2; j++){ //행읽기(6행까지나 2행까지만 필요)
								cellValue = "";
								cell = row.getCell(j); //핸드폰/이름/info1/info2/info3/info4/메모
								// 핸드폰, 이름만 공백체크
								if(j <= 1 && (cell == null || !StringUtils.isNotBlank(cell.toString().trim()))) { //셀에 값이 없으면  
									//System.out.println("Cell 데이터가 없습니다.");
									errMessage = "Cell 데이터가 없습니다.";
									
									modelAndView.addObject("errMessage", errMessage);
									modelAndView.addObject("result", "fail");
									return modelAndView;
								}
								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) {
									//전화번호
									if(cellValue.matches(phoneRegExp)) {
										addrVO.setAddrPhoneNo(cellValue);
									}else {
										errPhoneCnt++;
									}
								} 
								if(j == 1) addrVO.setAddrNm(cellValue);	//이름
	
							}
							addrService.insertAddr(addrVO);
						}
						modelAndView.addObject("result", "success");
						
						if(errPhoneCnt > 0) {
							modelAndView.addObject("errPhoneCnt", errPhoneCnt);
						}
					}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() > 100000) { //
							errMessage = "100000줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.";
							modelAndView.addObject("errMessage", errMessage);
							modelAndView.addObject("result", "fail");
							return modelAndView;
						}
						
						for(int i=2; i<sheet.getLastRowNum()+2; i++){ //먼저 밸리데이션 체크(1줄은 생략)
							XSSFRow row = sheet.getRow(i); //열읽기
							if(null == row) { 
								continue;
							}
							
							// 행의 두번째 열(핸드폰부터 받아오기) 
							XSSFCell cell = null;
							for(int j=0 ; j<2; j++){ //행읽기(6행까지나 2행까지만 필요)
								cellValue = "";
								cell = row.getCell(j); //핸드폰/이름/info1/info2/info3/info4/메모
								// 핸드폰, 이름만 공백체크
								if(j <= 1 && (cell == null || !StringUtils.isNotBlank(cell.toString().trim()))) { //셀에 값이 없으면  
									//System.out.println("Cell 데이터가 없습니다.");
									errMessage = "Cell 데이터가 없습니다.";
									modelAndView.addObject("errMessage", errMessage);
									modelAndView.addObject("result", "fail");
									return modelAndView;
								}
								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) {
									//전화번호
									if(cellValue.matches(phoneRegExp)) {
										addrVO.setAddrPhoneNo(cellValue);
									}else {
										errPhoneCnt++;
									}
								} 
								if(j == 1) addrVO.setAddrNm(cellValue);	//이름
								
							}
							addrService.insertAddr(addrVO);
						}
						modelAndView.addObject("result", "success");
						if(errPhoneCnt > 0) {
							modelAndView.addObject("errPhoneCnt", errPhoneCnt);
						}
					}	//xlsx 처리 끝
				}	
			}
			*/
			
			
			//3. 주소록 무료대행 처리상태 변경
			addrAgencyVO.setProcessStatus("E");
			addrAgencyService.update(addrAgencyVO);
			
			modelAndView.addObject("message", egovMessageSource.getMessage("success.common.update"));
			modelAndView.addObject("result", "success");
			
		}catch(Exception ex){
			ex.printStackTrace();
			
			modelAndView.addObject("message", egovMessageSource.getMessage("fail.common.update"));
			modelAndView.addObject("result", "fail");
			
		}
		
		
		return modelAndView;
	}
    
    /**
     * 주소록 입력 대행(무료) 관리 삭제 프로세서(del_flag : Y로 업데이트)
     * @param searchVO
     * @param model
     * @return	"/uss/ion/addragency/AddrAgencyDelete.do"
     * @throws Exception
     */
    @RequestMapping(value = {
    			"/uss/ion/addragency/AddrAgencyDelete.do"
    			}
    )
    public String AddrAgencyDelete(
    		@RequestParam("del") String[] del
    		, @ModelAttribute("searchVO") AddrAgencyVO addrAgencyVO
    		, HttpServletRequest request 
    		, RedirectAttributes redirectAttributes
    		, Model model
    		) throws Exception {
    	    	
    	logger.debug("AddrAgencyController-AddrAgencyDelete");
    	
    	//관리자 로그인 여부 체크
    	String isLogin = checkLoginUtil.isAdminLogin4PageMove(redirectAttributes);    	
    	if (!"Y".equals(isLogin)) return isLogin;  
    	
    	
    	//전달받은 AddrAgencyId로 삭제처리
    	try {
        	for(String id: del) {
        		addrAgencyVO.setAddrAgencyId(id);
        		addrAgencyVO.setDelFlag("Y");        		
        		addrAgencyService.update(addrAgencyVO);
     	    }
        	
        	redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete"));        	        	
        	
    	}catch(Exception e) {
    		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.delete"));
    	}
    	
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/addragency/selectAddrAgencyList.do");
		return redirectUrlMaker.getRedirectUrl();		
		
    }
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //
    //
    //	private function
    //
    //
    
    //페이징을 위한 처리 step1 - 페이징 기본 정보 설정
    private PaginationInfo setPagingStep1(AddrAgencyVO p_addrAgencyVO)throws Exception{
    	// pageing step1
    	PaginationInfo paginationInfo = new PaginationInfo();
    	paginationInfo.setCurrentPageNo(p_addrAgencyVO.getPageIndex());
    	paginationInfo.setRecordCountPerPage(p_addrAgencyVO.getPageUnit());
    	paginationInfo.setPageSize(p_addrAgencyVO.getPageSize());
    	
    	return paginationInfo;
    }

    
    //페이징을 위한 처리 step2 - 게시물 리스트 수량 설정 및 검색 조건 초기화
    private AddrAgencyVO setPagingStep2(
    		AddrAgencyVO p_addrAgencyVO
    		, PaginationInfo p_paginationInfo
    		)throws Exception{
    	// pageing step2
    	p_addrAgencyVO.setFirstIndex(p_paginationInfo.getFirstRecordIndex());
    	p_addrAgencyVO.setLastIndex(p_paginationInfo.getLastRecordIndex());
    	p_addrAgencyVO.setRecordCountPerPage(p_paginationInfo.getRecordCountPerPage());
    	
    	if("".equals(p_addrAgencyVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
    		p_addrAgencyVO.setSearchSortCnd("registPnttm");
    		p_addrAgencyVO.setSearchSortOrd("desc");
    	}
    	
    	return p_addrAgencyVO;    	
    }
    
    
    //페이징을 위한 처리 step3 - 전체 게시물 수량 설정하기
    private PaginationInfo setPagingStep3(
    		List<AddrAgencyVO> p_addrList
    		, PaginationInfo p_paginationInfo    		
    		)throws Exception{
    	// pageing step3
    	int totCnt = 0;
    	if(p_addrList.size() > 0) totCnt = p_addrList.get(0).getTotCnt();
    	p_paginationInfo.setTotalRecordCount(totCnt);
    	
    	return p_paginationInfo;
    }
        
    
    //사용자 업로드 파일 처리 - 하나의 파일만 처리
    private String takeFile(
    		MultipartHttpServletRequest p_multiRequest
    		, ModelAndView p_modelAndView
    		, BoardMasterVO p_bmVO
    		) throws Exception{
    	//Map<String, Object> p_map = new Map<>();
    	//Map<String, Object> in_map = new HashMap<>();
    	boolean in_bool	=	true;
    	
    	
		List<FileVO> result = null;
		String atchFileId = "";
		String isThumbFile = "";		
		//String isThumbFile = "thumbFile";	//"thumbFile"	-	썸네일을 생성한다.
		
		final Map<String, MultipartFile> files = p_multiRequest.getFileMap();
		if (!files.isEmpty()) {
			result = egovFileMngUtil.parseFileInf(files, "ADDRAGENCY_", 0, "", "", isThumbFile);
			// 파일 사이즈, 개수, 확장자 체크. model에 체크 오류 메세지 set
			
			//관리자에서 게시판 설정시 업로드 파일 사이즈와 수량 체크용
			if(!checkFileUtil.isPosblAtchFileMvWithBoardMaster(result, p_modelAndView, 0, "xlsx|xls|zip|hwp|txt|doc|docx|csv|vcf", p_bmVO)) {
				// 공통코드 Set
				//setBBSCommCd(model, bmVO);
				
				//model.addAttribute("bdMstr", bmVO);				
				//return "web/cop/bbs/EgovNoticeRegist";
				//modelAndView.addObject("bdMstr", bmVO);
				p_modelAndView.addObject("result", "fail");
				
				in_bool	=	false;
			}
			
			atchFileId = fileMngService.insertFileInfs(result);	//첨부 파일
		}
		
		if (!in_bool)	atchFileId = "ERROR";
		
		return atchFileId;
    }
    
    
    //addragency 게시물에 글 남기기
    private ModelAndView insertAddrAgencyBoard(
    		ModelAndView p_modelAndView
    		//, Map<String, Object> p_fileResult
    		, String p_atchFileId
    		
    		, AddrAgencyVO p_addrAgencyVO
    		, String p_content
    		, String p_registerId
    		//, String p_processStatus
    		, MultipartHttpServletRequest p_multiRequest
    		) throws Exception{
    	
		//게시판 등록하기
		try {
			
			String p_processStatus = "";
			p_processStatus = p_addrAgencyVO.getProcessStatus();
			if ("".equals(p_processStatus) || p_processStatus==null)	p_processStatus = "B";

			
			p_addrAgencyVO.setAtchFileId(p_atchFileId);
			p_addrAgencyVO.setRequestTxt(unscript(p_content));		// XSS 방지
			
			p_addrAgencyVO.setProcessStatus(p_processStatus);	//처리상태 B/I/E
			
			p_addrAgencyVO.setRegisterId(p_registerId);
			String userIp = EgovClntInfo.getClntIP(p_multiRequest);
			p_addrAgencyVO.setNtcrIp(userIp);
			
			
			addrAgencyService.insert(p_addrAgencyVO);	
			
			p_modelAndView.addObject("message", egovMessageSource.getMessage("success.common.insert"));
			p_modelAndView.addObject("result", "success");
			
		}catch(Exception ex){
			ex.printStackTrace();
			
			p_modelAndView.addObject("message", egovMessageSource.getMessage("fail.common.insert"));
			p_modelAndView.addObject("result", "fail");
			
		}
		
		return p_modelAndView;
    }
    
    
	/**
	 * XSS 방지 처리.
	 *
	 * @param data
	 * @return
	 */
	protected String unscript(String data) {
		if (data == null || data.trim().equals("")) {
			return "";
		}

		String ret = data;

		ret = ret.replaceAll("<(S|s)(C|c)(R|r)(I|i)(P|p)(T|t)", "&lt;script");
		ret = ret.replaceAll("</(S|s)(C|c)(R|r)(I|i)(P|p)(T|t)", "&lt;/script");

		ret = ret.replaceAll("<(O|o)(B|b)(J|j)(E|e)(C|c)(T|t)", "&lt;object");
		ret = ret.replaceAll("</(O|o)(B|b)(J|j)(E|e)(C|c)(T|t)", "&lt;/object");

		ret = ret.replaceAll("<(A|a)(P|p)(P|p)(L|l)(E|e)(T|t)", "&lt;applet");
		ret = ret.replaceAll("</(A|a)(P|p)(P|p)(L|l)(E|e)(T|t)", "&lt;/applet");

		ret = ret.replaceAll("<(E|e)(M|m)(B|b)(E|e)(D|d)", "&lt;embed");
		ret = ret.replaceAll("</(E|e)(M|m)(B|b)(E|e)(D|d)", "&lt;embed");

		ret = ret.replaceAll("<(F|f)(O|o)(R|r)(M|m)", "&lt;form");
		ret = ret.replaceAll("</(F|f)(O|o)(R|r)(M|m)", "&lt;form");

		//ret = ret.replaceAll("<", "&lt;");
		ret = ret.replaceAll("alert", "");
		//ret = ret.replaceAll("iframe", "");
		
		return ret;
	}
}
