package itn.let.mjo.pay.web;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.List;
import java.util.Map;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.RequestMethod;
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 com.mobilians.mcCancel_v0001.MC_Cancel;

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.EgovCmmUseService;
import itn.com.cmm.service.EgovFileMngService;
import itn.com.cmm.service.EgovFileMngUtil;
import itn.com.cmm.service.FileVO;
import itn.let.cop.bbs.service.BoardMasterVO;
import itn.let.mjo.addragency.service.AddrAgencyService;
import itn.let.mjo.addragency.service.AddrAgencyVO;
import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.mjo.msg.service.MjonMsgService;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.mjo.pay.service.MjonPayService;
import itn.let.mjo.pay.service.MjonPayVO;
import itn.let.mjo.pay.service.RefundService;
import itn.let.sym.site.service.EgovSiteManagerService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uss.umt.service.EgovMberManageService;
import itn.let.uss.umt.service.EgovUserManageService;
import itn.let.uss.umt.service.MberManageVO;
import itn.let.uss.umt.service.UserManageVO;
import itn.let.utl.fcc.service.EgovCryptoUtil;
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 MjonKGMPayController {
	
	@Resource(name = "mjonPayService")
    private MjonPayService mjonPayService;
	
	/** EgovMessageSource */
    @Resource(name="egovMessageSource")
    EgovMessageSource egovMessageSource;
    
    /** userManageService */
	@Resource(name = "userManageService")
	private EgovUserManageService userManageService;
	
	/** refundService */
	@Resource(name = "refundService")
    private RefundService refundService;
	
	@Resource(name = "mjonMsgService")
    private MjonMsgService mjonMsgService;
	
	@Resource(name = "MjonMsgDataService")
    private MjonMsgDataService mjonMsgDataService;
	
	@Resource(name = "mberManageService")
	private EgovMberManageService mberManageService;
	
	@Resource(name = "EgovCmmUseService")
	private EgovCmmUseService cmmUseService;	
	

	//암호화
	@Resource(name = "egovCryptoUtil")
	EgovCryptoUtil egovCryptoUtil;

	//로그인 처리
	@Resource(name = "checkLoginUtil")
	private CheckLoginUtil checkLoginUtil;
	
	//무료 대행 관련 쿼리
    @Resource(name="addrAgencyService")
    private AddrAgencyService addrAgencyService;
    
    //게시판 체크
	@Resource(name = "checkBoardUtil")
	private CheckBoardUtil checkBoardUtil;
	
    //첨부 파일 체크
	@Resource(name = "checkFileUtil")
	private CheckFileUtil checkFileUtil;
	
	//파일 체크 & 관리
    @Resource(name="EgovFileMngUtil")
	private EgovFileMngUtil egovFileMngUtil;
    
    //파일 정보 관리
    @Resource(name="EgovFileMngService")
    private EgovFileMngService fileMngService;
    
	/** 알림전송 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(MjonKGMPayController.class);
    
    /////////////////////////////////////////////////////////////////////////////////////////
    //
    //
    //	USER
    //
    //
    
    /**
     * KGM mobile 결제 Action 페이지 
     * @param searchVO
     * @param model
     * @throws Exception
     */
    @RequestMapping(value= {"/web/kgm/pay/KGMPayActionAjax.do"})
	public String KGMPayActionAjax(@ModelAttribute("mjonPayVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			ModelMap model) throws Exception{
    	
    	String userId = "";
    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	if(EgovUserDetailsHelper.isAuthenticated() && loginVO != null) {
    		userId = loginVO.getId();
    	}
    	mjonPayVO.setMoid(userId);
    	
		model.addAttribute("mjonPayVO", mjonPayVO);
		
		return "web/cop/kgm/mc_web";
	}
    
    /**
     * KGM mobile 결제 okurl 페이지 
     * @param searchVO
     * @param model
     * @throws Exception
     */
    @RequestMapping(value= {"/web/kgm/pay/NotiUrlAjax.do"})
	public String NotiUrlAjax(			
			HttpServletRequest request
			, ModelMap model
			) throws Exception{
    	
    	System.out.println("request.toString()");
    	System.out.println(request.toString());
    	
		return "web/cop/kgm/notiurl";
		
	}
    
    /**
     * KGM mobile 결제 okurl 페이지 
     * @param searchVO
     * @param model
     * @throws Exception
     */
    @RequestMapping(value= {"/web/kgm/pay/OkUrlAjax.do"})
	public String OkUrlAjax(			
			HttpServletRequest request
			, HttpSession session
			, HttpServletResponse response			
			, ModelMap model
			, RedirectAttributes redirect
			) throws Exception{

		//크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리
		response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None");
		
    	String Resultcd		= request.getParameter("Resultcd");		//[   4byte 고정] 결과코드
    	String Resultmsg	= URLDecoder.decode(request.getParameter("Resultmsg"), "euc-kr");	//[ 100byte 이하] 결과메세지 
    	String AutoBillKey	= request.getParameter("AutoBillKey");	//[  15byte 이하] 자동결제 최초등록키
    	String CASH_GB		= request.getParameter("CASH_GB");		//[   2byte 고정] 결제수단(MC)
    	String Commid		= request.getParameter("Commid");		//[   3byte 고정] 이통사
    	String Mobilid		= request.getParameter("Mobilid");		//[  15byte 이하] 모빌리언스 거래번호
    	String Mrchid		= request.getParameter("Mrchid");		//[   8byte 고정] 상점ID
    	String MSTR			= request.getParameter("MSTR");			//[2000byte 이하] 가맹점 전달 콜백변수
    	String No			= request.getParameter("No");			//[  11byte 이하] 폰번호
    	String Payeremail	= request.getParameter("Payeremail");	//[  30byte 이하] 결제자 이메일
    	String Prdtnm		= URLDecoder.decode(request.getParameter("Prdtnm"), "euc-kr"); 		//[  50byte 이하] 상품명
    	String Prdtprice	= request.getParameter("Prdtprice");	//[  10byte 이하] 상품가격
    	String Signdate		= request.getParameter("Signdate");		//[  14byte 이하] 결제일자
    	String Svcid		= request.getParameter("Svcid");		//[  12byte 고정] 서비스ID
    	String Tradeid		= request.getParameter("Tradeid");		//[  40byte 이하] 상점거래번호
    	String Userid		= request.getParameter("Userid");		//[  20byte 이하] 사용자ID
    	String USERKEY		= request.getParameter("USERKEY");		//[  15byte 이하] 휴대폰정보(이통사, 휴대폰번호, 주민번호) 대체용 USERKEY
    	String MC_EZ_KEY	= request.getParameter("Ezkey");		//[  20byte 고정] 간소화결제 사용자키
    	

    	// 사용자 정보
    	String mberNm = "";
    	String moblphonNo = "";
    	String mberEmailAdres = "";
    	MberManageVO mberManageVO = new MberManageVO();
    	mberManageVO.setMberId(Userid);
    	MberManageVO userInfo = userManageService.selectUserInfo(mberManageVO);
    	if (userInfo != null) {
    		mberNm = userInfo.getMberNm();
    		moblphonNo = userInfo.getMoblphonNo();
    		mberEmailAdres = userInfo.getMberEmailAdres();    		
    	}
    	
    	// MjonPayVO
    	MjonPayVO mjonPayVO = new MjonPayVO();
    	mjonPayVO.setResultCd(Resultcd);
    	mjonPayVO.setResultMsg(Resultmsg);
    	mjonPayVO.setAutoBillKey(AutoBillKey);
    	mjonPayVO.setCashGb(CASH_GB);
    	mjonPayVO.setAutoYn("");
    	mjonPayVO.setCommId(Commid);
    	mjonPayVO.setMobileId(Mobilid);
    	mjonPayVO.setMrchId(Mrchid);
    	mjonPayVO.setPno(No);
    	mjonPayVO.setPayerEmail(Payeremail);
    	mjonPayVO.setPrdtNm(Prdtnm);
    	mjonPayVO.setPrdtPrice(Prdtprice);
    	mjonPayVO.setSignDate(Signdate);
    	mjonPayVO.setSvcId(Svcid);
    	mjonPayVO.setTradeId(Tradeid);
    	mjonPayVO.setUserId(Userid);
    	mjonPayVO.setUserKey(USERKEY);
    	mjonPayVO.setMcEzKey(MC_EZ_KEY);

    	// 추가정보(mj_pg)
    	String pgStatus = "";
    	if("0000".equals(Resultcd)) {
    		pgStatus = "1";		// 1:결제완료
    	}
    	else {
    		pgStatus = "4";		// 4.결제오류
    	}
    	mjonPayVO.setPgStatus(pgStatus);		// 결제 상태 - 0:입금대기, 1:결제완료, 4.결제오류, 9:취소완료
    	mjonPayVO.setRcptType("9");				// 현금영수증 유형-0:미발행, 1:소득공제, 2:지출증빙, 9:세금계산서[PG에 없는 값]
    	mjonPayVO.setResultCode(Resultcd); 
    	mjonPayVO.setResultMsg(Resultmsg); 
    	mjonPayVO.setAmt(Prdtprice);			// 결제금액
		mjonPayVO.setPayMethod("CELLPHONE");	// 결제방법
		mjonPayVO.setPgCode("KGM");				//
		mjonPayVO.setGoodsName("KG 모빌리언스");	//
		mjonPayVO.setPhone(No);					// 모바일
		mjonPayVO.setMobile(No);					// 모바일
		mjonPayVO.setEmail(mberEmailAdres);			// 이메일(회원정보)
		mjonPayVO.setTid(Tradeid);				// Tid
		mjonPayVO.setMid(Mrchid);				// Mid
		// 회원정보
    	mjonPayVO.setBuyerName(mberNm);
    	mjonPayVO.setBuyerEmail(moblphonNo);
    	mjonPayVO.setBuyerTel(mberEmailAdres);    		
		
		// 로그인정보
		/*
    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	if(EgovUserDetailsHelper.isAuthenticated() && loginVO != null) {
        	mjonPayVO.setBuyerName(loginVO.getName());
        	mjonPayVO.setBuyerEmail(loginVO.getEmail());
        	mjonPayVO.setBuyerTel(loginVO.getTel());
    	}
    	else {
    		// 재로그인 처리
    		//Userid
    	}
    	*/

		// 인서트
    	mjonPayService.insertKgmAll(mjonPayVO);    	
    	
    	// 휴대폰 15만원결제 => 법인폰 알림
    	if (mjonPayVO.getAmt().equals("165000")) {
    		// 법인폰 알람여부 체크
    		JoinSettingVO joinSettingVO = new JoinSettingVO();
    		joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
    		// SMS 체크
    		if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) {
    			// 스미싱의심 SMS 알림전송
    			mjonNoticeSendUtil.smishingSmsNoticeSend("스미싱의심/휴대폰 15만원 결제", Userid, mberNm);    		
    		}    		
    		
    		// SLACK 체크
    		if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {    		
	    		// Slack 메시지 발송(단순본문)
	    		String msg = "[문자온] 스미싱의심/휴대폰 15만원 결제 - " + mberNm +"("+ Userid + ")";
	    		mjonCommon.sendSimpleSlackMsg(msg);    		
    		}
    		
    		// 스미싱 의심회원으로 변경
    		UserManageVO userManageVO = new UserManageVO();
    		userManageVO.setSmishingYn("Y");
    		userManageVO.setMberId(Userid);
    		userManageService.updateOneUserSmishingYn(userManageVO);
    	}
    	
    	redirect.addAttribute("Resultcd", Resultcd);
    	redirect.addAttribute("Tradeid", Tradeid);
    	redirect.addAttribute("Prdtprice", Prdtprice);

    	//return "web/cop/kgm/okurl";
        return "redirect:/web/kgm/pay/kgmResultAjax.do";
	}
    
    static String convert(String str, String encoding) throws IOException {
    	  ByteArrayOutputStream requestOutputStream = new ByteArrayOutputStream();
    	  requestOutputStream.write(str.getBytes(encoding));
    	  
    	  return requestOutputStream.toString(encoding);
    }
    
    /**
     * KGM mobile 결제 Result 페이지 
     * @param searchVO
     * @param model
     * @throws Exception
     */
    @RequestMapping(value= {"/web/kgm/pay/kgmResultAjax"}, method=RequestMethod.GET)
	public String kgmResultAjax(HttpServletRequest request
			, ModelMap model
			) throws Exception{

    	String Resultmsg = "";
    	String Prdtprice = "";
    	if("0000".equals(request.getParameter("Resultcd"))) {
    		Prdtprice = request.getParameter("Prdtprice");
    		
	    	/*
    		MjonPayVO mjonPayVO = new MjonPayVO();
	    	mjonPayVO.setTradeId(request.getParameter("Tradeid"));
	    	mjonPayVO = mjonPayService.selectKgmVO(mjonPayVO);
	    	if (!mjonPayVO.equals(null)) {
	    		
	    	}
	    	*/	    
	    	
	    	// 로그인정보
	    	/*
	    	String userId = "";
	    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
	    	if(EgovUserDetailsHelper.isAuthenticated() && loginVO != null) {
	    	}
	    	else {
	    		// 재로그인 처리
	    		userId = mjonPayVO.getUserId();
	    	}
	    	*/
	    	
	    	Resultmsg = "휴대폰결제 정상처리 되었습니다.";
    	}
    	else {
    		Resultmsg = "휴대폰결제 실패 했습니다.";
    	}

    	model.addAttribute("Resultcd", request.getParameter("Resultcd"));
    	model.addAttribute("Resultmsg", Resultmsg);
    	model.addAttribute("Prdtprice", Prdtprice);
    	
    	
		return "web/cop/kgm/result";
	}
    
    
    /**
     * KGM mobile 결제 okurl 페이지 
     * @param searchVO
     * @param model
     * @throws Exception
     */
    @RequestMapping(value= {"/web/kgm/pay/kgmCancelAjax.do"}, method=RequestMethod.GET)
	public String kgmCancelAjax(HttpServletRequest request
    		, HttpServletResponse response 
			, ModelMap model
			) throws Exception {

    	Boolean isSuccess = true;
    	String msg = "";
    	String resultCd		= ""; 	// 리턴코드
    	String resultMsg	= ""; 	// 리턴메시지
    	
        try {
        	// 아래정보가 맞지 않을 경우 취소정보 불일치 0045 가 리턴됩니다.
        	String Mrchid="";     	//모빌리언스가 부여한 상점아이디 8자리
        	String Svcid="";       	//모빌리언스가 부여한 서비스아이디 12자리
        	String Tradeid = ""; 	//결제된 상점거래번호
        	String Prdtprice = ""; 	//결제된 금액
        	String Mobilid = "";    //결제된 모빌리언스 거래번호
        		
        	Mrchid    = request.getParameter("Mrchid");
        	Svcid     = request.getParameter("Svcid");
        	Tradeid   = request.getParameter("Tradeid");
        	Prdtprice = request.getParameter("Prdtprice");
        	Mobilid   = request.getParameter("Mobilid");
        	
        	// MOID : MOID_000000000000630
        	Mrchid    = "17062204";
        	Svcid     = "170622040674";
        	Tradeid   = "170622040674_202204191748300618";
        	Prdtprice = "3000";
        	Mobilid   = "5002140398";
        	
			String kgmServerIp = "";   // 메인서버아이피
			int kgmServerPort = 0;    // 서버포트
			String kgmSwitchIp = "";   // 백업서버아이피
			int kgmRecvTimeOut = 0;   // 전문수신타임아웃
			String kgmLogDir = "";      // 로그경로

			String serverName = request.getServerName().toLowerCase();
			int serverPort = request.getServerPort();
			System.out.println("serverName : "+ serverName);
			System.out.println("serverPort : "+ serverPort);
			if (serverName.lastIndexOf("localhost") > -1 || serverName.lastIndexOf("127.0.0.1") > -1) {
				System.out.println("KGM 연결서버 : 개발서버1");
				// 개발서버
				kgmServerIp = "175.158.12.131";
				kgmServerPort = 7500;
				kgmSwitchIp = "175.158.12.131";
				kgmRecvTimeOut = 30000;
				kgmLogDir = "c:\\cancel_log\\";
			}
			else if (serverPort != 80 || serverPort != 443) {
				System.out.println("KGM 연결서버 : 개발서버2");
				// 개발서버
				kgmServerIp = "175.158.12.131";
				kgmServerPort = 7500;
				kgmSwitchIp = "175.158.12.131";
				kgmRecvTimeOut = 30000;
				kgmLogDir = "c:\\cancel_log\\";				
			}
			else {
				System.out.println("KGM 연결서버 : 운영서버");
				// 운영서버
				kgmServerIp = "175.158.12.140";
				kgmServerPort = 7500;
				kgmSwitchIp = "218.50.55.107";
				kgmRecvTimeOut = 30000;
				kgmLogDir = "/cancel_log/";								
			}
			
			// MC Cancel
			/*
        	MC_Cancel cancel = new MC_Cancel();
        	cancel.setServerInfo(kgmServerIp, kgmServerPort, kgmSwitchIp, kgmRecvTimeOut, kgmLogDir);
        	resultCd = cancel.cancel_attempt(Mrchid, Svcid, Tradeid, Prdtprice, Mobilid);	// 결제취소요청
        	resultMsg = getMobiliansCancelReturnMsg(resultCd);
        	if (resultCd.equals("0000") ) {
        		// 결제취소 성공
        		
        	} else {
        		// 결제취소 실패
        	}        	

        	// KG 모빌리언스 취소 리턴메시지
        	System.out.println("<h3>결과코드 : "+ resultCd +"</h3>" );
        	System.out.println("<h3>결과메시지 : "+ getMobiliansCancelReturnMsg(resultCd) +"</h3>" );
        	if (resultCd.equals("0000") ) {
        		System.out.println("<h3>결제취소 성공</h3>");		
        	} else {
        		System.out.println("<h3>결제취소 실패</h3>");
        	}
        	*/ 
        	
        } catch (Exception e) {
            e.printStackTrace();
            isSuccess = false;
            msg = "Err : " + e.getMessage();
        }
        
		model.clear();
		model.addAttribute("isSuccess", isSuccess);
		model.addAttribute("msg", msg);        
		model.addAttribute("resultCd", resultCd);
		model.addAttribute("resultMsg", resultMsg);
 
        return ""; 
    }
    
    // KG 모빌리언스 취소 리턴메시지
	public static String getMobiliansCancelReturnMsg(String val) {
		String rtnVal = "";
        switch (val.trim().toUpperCase()) {
		case "0000":
			rtnVal = "정상취소처리";
			break;
		case "0011":
			rtnVal = "통신사미등록폰";
			break;
		case "0014":
			rtnVal = "해지된 폰";
			break;
		case "0020":
			rtnVal = "SKT,LGT 경우 휴대폰정보 변경으로 인한 취소실패";
			break;
		case "0041":
			rtnVal = "거래내역 없음";
			break;
		case "0042":
			rtnVal = "취소기간경과";
			break;
		case "0044":
			rtnVal = "이미 취소된 자료";
			break;
		case "0045":
			rtnVal = "취소 자료 정보 불일치";
			break;
		case "0097":
			rtnVal = "요청자료 오류";
			break;
		case "0098":
			rtnVal = "통신사 통신오류";
			break;
		case "0099":
			rtnVal = "기타";
			break;    			
        }        	
		
		return rtnVal;
	}	    
    
    
    /////////////////////////////////////////////////////////////////////////////////////////
    //
    //
    //	ADMIN
    //
    //
    
    /**
     * 주소록 입력 대행(무료) 관리 화면
     * @param addrVO
     * @param model
     * @return
     * @throws Exception
     */
        
    @RequestMapping(value= {
    		"/uss/ion/paycellphone/selectVirtualAccountList.do"
			})    
    public String selectAddrAgencyListAdmin(
    		HttpServletRequest request
    		, @ModelAttribute("searchVO") AddrAgencyVO addrAgencyVO
    		, ModelMap model
    		, RedirectAttributes redirectAttributes
    		) throws Exception {

    	
    	//관리자 로그인 여부 체크
    	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/paycellphone/VirtualAccountList";    	
    	
    }
    
    /**
     * 주소록 입력 대행(무료) 관리 리스트 ajax 부분
     * @param addrVO
     * @param model
     * @return
     * @throws Exception
     */
    
    @RequestMapping(value= {
    					"/uss/ion/paycellphone/selectAddrAgencyListAjax.do"    					
    					})
    public String selectAddrAgencyListAjaxAdmin(
    		HttpServletRequest request
    		, @ModelAttribute("searchVO") AddrAgencyVO addrAgencyVO
    		, ModelMap model
    		, RedirectAttributes redirectAttributes
    		) throws Exception {
    	
    	//관리자 로그인 여부 체크
    	String isLogin = checkLoginUtil.isAdminLogin4PageMove(redirectAttributes);    	
    	if (!"Y".equals(isLogin)) return isLogin;   	
    	

    	// 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/paycellphone/AddrAgencyListAjax";
    	
    }
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //
    //
    //	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", 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;
	}
	
}
