package itn.let.mjo.event.web;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

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

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.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.LoginVO;
import itn.com.cmm.util.StringUtil;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.cop.bbs.service.BoardVO;
import itn.let.mjo.event.service.MjonEventService;
import itn.let.mjo.event.service.MjonEventVO;
import itn.let.mjo.msgcampain.service.MjonCandidateService;
import itn.let.mjo.msgcampain.service.MjonCandidateVO;
import itn.let.mjo.pay.service.MjonPayService;
import itn.let.mjo.pay.service.MjonPayVO;
import itn.let.mjo.pay.service.MjonVaMsgLogVO;
import itn.let.mjo.payva.service.VacsVactService;
import itn.let.mjo.payva.service.VacsVactVO;
import itn.let.uss.umt.service.EgovMberManageService;
import itn.let.uss.umt.service.MberManageVO;

@Controller
public class MjonEventController {

	@Resource(name = "MjonEventService")
    private MjonEventService mjonEventService;
	
	@Resource(name = "mberManageService")
	private EgovMberManageService mberManageService;
	
	@Resource(name = "mjonCandidateService")
    private MjonCandidateService mjonCandidateService;
	
	//전용계좌 서비스
	@Resource(name = "vacsVactService")
	private VacsVactService vacsVactService;
	
	@Resource(name = "mjonPayService")
    private MjonPayService mjonPayService;
	
	
	@RequestMapping("/web/event/selectEventPopAjax.do")
	public String selectEventPopAjas(MjonEventVO mjonEventVO, ModelMap model ) throws Exception{
		
		try {
		
			//로그인 권한정보 불러오기
			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
			model.addAttribute("loginVO", loginVO);
			
			if(loginVO != null) {
				
				System.out.println("+++++++++++++++++++++++ mberId ::: "+loginVO.getId());
				
			}
			
			String nttSj = "[첫결제 이벤트] 첫 결제 시, 누구나 조건 없이 인생 최저가!";
			BoardVO boardVO = new BoardVO();
			boardVO.setBbsId("BBSMSTR_000000000731");
			boardVO.setNttSj(nttSj);
			BoardVO resultEvent = mjonEventService.selectEventInfoByNttSj(boardVO);
			
			model.addAttribute("resultEvent", resultEvent);
			
		} catch (Exception e) {
			throw new Exception(e);
		}
		
		return "web/event/eventMsgFrstPop";
		
	}
	
	/**
	 * 이벤트 회원 정보 테이블에 기본 정보 입력해 주기.
	 * 회원아이디, 회원이름, 이벤트 게시판 번호, 이벤트 게시글 번호, 회원 단가 정보, 이벤트 수신동의, 이벤트 유효 상태값(미진행 : N 으로 셋팅)
	 * 
	 * */
	@RequestMapping("/web/event/insertEventDefaultMberInfoAjax.do")
	public ModelAndView insertEventDefaultMberInfoAjax(MjonEventVO mjonEventVO) throws Exception{
		ModelAndView modelAndView = new ModelAndView();
    	modelAndView.setViewName("jsonView");
    	
    	//로그인 권한정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	
		if(loginVO == null) {
			
			modelAndView.addObject("resultSts", "loginFail");
			return modelAndView;
			
		}else {
			
			/**
			 * 이벤트 컨텐츠 정보 불러오기
			 * 이벤트 게시글 제목 및 카테고리로 검색해서 불러온다.
			 * 
			 * */
			float nttId = 0;
			String bbsId = "BBSMSTR_000000000731";	//이벤트 게시판 번호
			String nttSj = "[첫결제 이벤트] 첫 결제 시, 누구나 조건 없이 인생 최저가!";
			BoardVO resultEvent = selectEventBoardInfo(bbsId, nttSj);
			
			if(resultEvent != null) {//이벤트 게시판의 이벤트 게시글 번호 셋팅
				
				mjonEventVO.setEventNttId(Float.toString(resultEvent.getNttId()));
				
			}else {//이벤트 게시글 정보가 없으면 0으로 셋팅.
				
				modelAndView.addObject("resultSts", "eventEnded");
				return modelAndView;
				
			}
			
			//이벤트 회원 정보 조회
			MjonEventVO eventMberInfo = selectEventMsgMberDefaultInfo(mjonEventVO, resultEvent.getNttId(), bbsId, loginVO.getId(), loginVO.getName());
			
			int resultCnt = 0;
			
			if(eventMberInfo == null) {//등록된 회원정보가 없으면 정보 입력
				mjonEventVO.setEventStatus("N");
				resultCnt = mjonEventService.insertEventMsgMberDefaultInfo(mjonEventVO);
			}else {//등록된 회원정보가 있으면 화면 이동 및 메세지 처리
				
				String status = eventMberInfo.getEventStatus();
				
				if(status.equals("Y")) {//이벤트가 진행중인 경우
					
					modelAndView.addObject("resultSts", "eventJoined");
					
				}else if(status.equals("E")) {//이벤트가 종료된 경우
					
					modelAndView.addObject("resultSts", "eventEnded");
					
				}else {//이벤트 미진행인 경우 성공으로 결제페이지로 이동되도록 한다.
					
					modelAndView.addObject("resultSts", "success");
					
				}
				
				return modelAndView;
				
			}
			
			modelAndView.addObject("resultSts", "success");
		}
		
    	return modelAndView;
	}
	
	/**
	 * 이벤트 회원 정보 테이블에 기본 정보 입력해 주기.
	 * 회원아이디, 회원이름, 이벤트 게시판 번호, 이벤트 게시글 번호, 회원 단가 정보, 이벤트 수신동의, 이벤트 유효 상태값(미진행 : N 으로 셋팅)
	 * 
	 * */
	@RequestMapping("/web/event/updateEventPolicyMberInfoAjax.do")
	public ModelAndView updateEventPolicyMberInfoAjax(MjonEventVO mjonEventVO) throws Exception{
		ModelAndView modelAndView = new ModelAndView();
    	modelAndView.setViewName("jsonView");
    	
    	//로그인 권한정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	
		if(loginVO == null) {
			
			modelAndView.addObject("message", "문자온 서비스는 로그인 후 이용 가능합니다.");
			modelAndView.addObject("resultSts", "loginFail");
			return modelAndView;
			
		}else {
			
			mjonEventVO.setMberId(loginVO.getId());
			mjonEventVO.setMberNm(loginVO.getName());
			
			//이벤트 회원정보 존재여부 확인 및 회원 정보 불러오기
			MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo(mjonEventVO);
			
			int resultCnt = 0;
			
			if(eventMberInfo == null) {//등록된 회원정보가 없으면 오류 발생
				//mjonEventVO.setEventStatus("N");
				//resultCnt = mjonEventService.insertEventMsgMberDefaultInfo(mjonEventVO);
				modelAndView.addObject("message", "이벤트 회원 정보가 없습니다.");
				modelAndView.addObject("resultSts", "emptyMber");
				return modelAndView;
				
			}else if(!eventMberInfo.getEventStatus().equals("N")){//이벤트가 진행중이거나, 종료된 회원인 경우
				
				modelAndView.addObject("message", "현재 이벤트를 진행 중이시거나 완료하신 회원입니다.");
				modelAndView.addObject("resultSts", "statusFail");
				return modelAndView;
				
			}else {//등록된 회원정보가 있으면 유의사항 및 문자 수신 동의 정보 업데이트 처리
				
				resultCnt = mjonEventService.updateEventPolicyMberInfo(mjonEventVO);

				if(resultCnt > 0) {//수정이 정상적으로 된 경우
					
					modelAndView.addObject("resultSts", "success");
					
				}else {//이벤트 미진행인 경우 성공으로 결제페이지로 이동되도록 한다.
					
					modelAndView.addObject("resultSts", "updateFail");
					
				}
				
				return modelAndView;
				
			}
			
		}
		
	}
	
    /**
     * 이벤트 결제하기 화면
     * @param searchVO
     * @param model
     * @return	"/web/pay/PayView.do"
     * @throws Exception
     */
    @RequestMapping(value= {"/web/event/member/pay/PayView.do"})
	public String PayView(@ModelAttribute("mjonPayVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request, RedirectAttributes redirectAttributes,
			ModelMap model) throws Exception{
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;

    	//로그인 정보 획득
//    	LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	
		if(loginVO == null) {
			//redirectAttributes.addFlashAttribute("message", "문자온 서비스는 로그인 후 이용 가능합니다.");
			return "redirect:/web/user/login/login.do";
		}
		
		//기존 결제 내역이 있는 회원인지 확인
		int payCnt = 0;
		if(StringUtil.isNotEmpty(userId)) {
			//결제내역 카운트 조회
			payCnt = mjonPayService.selectMemerPayCount(userId);
			
			if(payCnt > 0) {
				
				redirectAttributes.addFlashAttribute("message", "고객님께서는 첫결제 이벤트 대상이 아닙니다.");
				return "redirect:/web/main/mainPage.do";
				
			}else {
				
				String bbsId = "BBSMSTR_000000000731";	//이벤트 게시판 번호
				String nttSj = "[첫결제 이벤트] 첫 결제 시, 누구나 조건 없이 인생 최저가!";
				BoardVO resultEvent = selectEventBoardInfo(bbsId, nttSj);
				
				
				if(resultEvent != null) {//진행중 이벤트 이면 이벤트 게시글 번호 셋팅
					
					//이벤트 회원 정보 조회
					MjonEventVO mjonEventVO = new MjonEventVO();
					MjonEventVO eventMberInfo = selectEventMsgMberDefaultInfo(mjonEventVO, resultEvent.getNttId(), bbsId, loginVO.getId(), loginVO.getName());
					
					int resultCnt = 0;
					
					if(eventMberInfo == null) {//등록된 회원정보가 없으면 정보 입력
						mjonEventVO.setEventStatus("N");
						resultCnt = mjonEventService.insertEventMsgMberDefaultInfo(mjonEventVO);
					}else {//등록된 회원정보가 있으면 화면 이동 및 메세지 처리
						
						String status = eventMberInfo.getEventStatus();
						
						if(status.equals("Y")) {//이벤트가 진행중인 경우
							
							redirectAttributes.addFlashAttribute("message", "현재 첫 결제 이벤트를 진행중입니다.");
							return "redirect:/web/main/mainPage.do";
							
						}else if(status.equals("E")) {//이벤트가 종료된 경우
							
							redirectAttributes.addFlashAttribute("message", "현재 첫 결제 이벤트를 완료 하였습니다.");
							return "redirect:/web/main/mainPage.do";
							
						}
						
					}
					
				}else {//이벤트 게시글 정보가 없으면 0으로 셋팅.
					
					redirectAttributes.addFlashAttribute("message", "첫 결제 이벤트는 종료 되었습니다.");
					return "redirect:/web/main/mainPage.do";
					
				}
				
			}
			
		}

		MberManageVO mberManageVO = mberManageService.selectMber(loginVO.getId());
    	model.addAttribute("mberManageVO", mberManageVO);
    	
    	MjonCandidateVO mjonCandidateVO = new MjonCandidateVO();
    	if(userId != "") { 
    		mjonCandidateVO = mjonCandidateService.selectCandidateDataInfo(userId);
    		model.addAttribute("mjonCandidateVO",mjonCandidateVO);
    	}
		
    	mjonPayVO.setReturnURL(request.getRequestURL().toString().split("pay")[0] + "nicepay/payResultAjax.do") ;
    	
		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mjonPayVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mjonPayVO.getPageUnit());
		paginationInfo.setPageSize(mjonPayVO.getPageSize());
		
		mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			mjonPayVO.setSearchSortCnd("moid");
			mjonPayVO.setSearchSortOrd("desc");
		}
		mjonPayVO.setUserId(loginVO.getId());
		
        /*List<MjonPayVO> resultList = mjonPayService.selectPayList(mjonPayVO);*/   
        
        /*model.addAttribute("resultList", resultList);
        paginationInfo.setTotalRecordCount(resultList.size() > 0 ? ((MjonPayVO)resultList.get(0)).getTotCnt() : 0);*/
		/*model.addAttribute("paginationInfo", paginationInfo);*/
		
		//대상 리스트 가져오기    
		VacsVactVO vacsVactVO = new VacsVactVO();
		vacsVactVO.setMberId(loginVO.getId());
    	//List<?> bankList = vacsVactService.selectBankAcctList(tempVO);		//할당 가능한 계좌 수량  리스트 받아오기
    	List<?> bankList = vacsVactService.selectBankAcctAllList(vacsVactVO);		//할당 가능한 계좌 수량  리스트 받아오기
    	List<?> myBankList = vacsVactService.selectMyBankAcctList(vacsVactVO);		//내가 할당받은 전용계좌 리스트 받아오기
    	
    	MjonVaMsgLogVO vaMsgLogVO = new MjonVaMsgLogVO();
    	vaMsgLogVO.setMberId(loginVO.getId());
    	
    	Date now = new Date();
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String date = sdf.format(now);
		vaMsgLogVO.setSendDate(date);
		
    	MjonVaMsgLogVO resultMsgInfo = mjonPayService.selectMyAcctSendCnt(vaMsgLogVO);
    	
    	//대상 리스트, 페이징 정보 전달
    	model.addAttribute("resultList", bankList);
    	model.addAttribute("resultMyList", myBankList);
    	model.addAttribute("resultMsgInfo", resultMsgInfo);
    	model.addAttribute("mjonPayVO", mjonPayVO);
    	
    	// 탭이동
    	String tabType = "1";
    	if(request.getParameter("tabType") != null) {
    		tabType = request.getParameter("tabType");
   		}
    	model.addAttribute("tabType", tabType);
    	
		return "/web/event/pay/EventPayView";
	}
    
    
    //이벤트 게시글 정보 불러오기 함수
    public BoardVO selectEventBoardInfo(String bbsId, String nttSj) throws Exception{
    	
		BoardVO boardVO = new BoardVO();
		boardVO.setBbsId(bbsId);
		boardVO.setNttSj(nttSj);
		BoardVO resultEvent = mjonEventService.selectEventInfoByNttSj(boardVO);
		
		return resultEvent;
    }
    
    //이벤트 회원 정보 불러오기 함수
    public MjonEventVO selectEventMsgMberDefaultInfo(MjonEventVO mjonEventVO, float nttId, String bbsId, String mberId, String mberNm) throws Exception{
    	
    	mjonEventVO.setEventNttId(Float.toString(nttId));
		mjonEventVO.setEventBbsId(bbsId);
		mjonEventVO.setMberId(mberId);
		mjonEventVO.setMberNm(mberNm);
		mjonEventVO.setEventShortPrice("7.5");
		mjonEventVO.setEventLongPrice("32");
		mjonEventVO.setEventPicturePrice("59");
		mjonEventVO.setEventPicture2Price("67");
		mjonEventVO.setEventPicture3Price("70");
		
		//이벤트 회원정보 존재여부 확인 및 회원 정보 불러오기
		MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo(mjonEventVO);
		
		return eventMberInfo;
    }
    
}
