package incheon.res.rdm.dp.confirm.web;


import incheon.com.cmm.api.DefaultApiResponse;
import incheon.com.security.vo.LoginVO;
import incheon.res.rdm.com.code.service.RdmComCodeService;
import incheon.res.rdm.com.digplan.service.RdmComDigplanService;
import incheon.res.rdm.com.digplan.vo.RdmComDigplanVO;
import incheon.res.rdm.com.digsize.service.RdmComDigsizeService;
import incheon.res.rdm.com.digsize.vo.RdmComDigsizeVO;
import incheon.res.rdm.com.discuss.service.RdmComDiscussService;
import incheon.res.rdm.com.discuss.vo.RdmComDiscussVO;
import incheon.res.rdm.com.levy.vo.LevyAcceptVO;
import incheon.res.rdm.com.peracc.service.RdmComPeraccService;
import incheon.res.rdm.com.peracc.vo.RdmComPeraccVO;
import incheon.res.rdm.com.perinfo.service.RdmComPerinfoService;
import incheon.res.rdm.com.perinfo.vo.RdmComPerinfo;
import incheon.res.rdm.com.perinfo.vo.RdmComPerinfoVO;
import incheon.res.rdm.dp.confirm.service.RdmDpConfirmService;
import incheon.res.rdm.dp.confirm.vo.RdmDpConfirm;
import incheon.res.rdm.dp.confirm.vo.RdmDpConfirmVO;
import incheon.res.rdm.dp.levy.service.RdmDpLevyService;
import incheon.res.rdm.dp.levy.vo.RdmDpLevyVO;
import incheon.res.mng.govoff.service.RdmOeGovoffService;
import incheon.res.mng.govoff.vo.RdmOeGovoff;
import incheon.res.mng.govoff.vo.RdmOeGovoffVO;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.egovframe.rte.fdl.property.EgovPropertyService;
import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import org.springframework.http.ResponseEntity;
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 javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.*;

@Controller
@RequestMapping("${api.rps-path}")
public class RdmDpConfirmController {

	protected Log log = LogFactory.getLog(this.getClass());
	@Resource
    private RdmDpConfirmService rdmDpConfirmService;
	@Resource
    private RdmComPeraccService rdmComPeraccService;
	@Resource
    private RdmComCodeService rdmComCodeService;
	@Resource
    private RdmComPerinfoService rdmComPerinfoService;
	@Resource
    private RdmOeGovoffService rdmOeGovoffService;
	@Resource
    private RdmComDiscussService rdmComDiscussService;
	@Resource
    private RdmComDigsizeService rdmComDigsizeService;
	@Resource
    private RdmComDigplanService rdmComDigplanService;
    @Resource
    private RdmDpLevyService rdmDpLevyService;
    @Resource(name = "propertiesService")
    protected EgovPropertyService propertiesService;

    /**
	 * @MethodDESC : 허가승인 리스트
	 */
	@RequestMapping(value = "/RdmDpConfirmL010.do")
	public String selectConfirmList(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute RdmDpConfirmVO vo,
			@RequestParam(defaultValue = "1") int pageIndex,
			ModelMap model)
	  throws Exception{

		RdmComPeraccVO rdmComPeraccVO = new RdmComPeraccVO();
		String[] arrStr ={"RDH208","RDH209","RDH210","RDH302", "RDH303"};
		rdmComPeraccVO.setRoadDggPrcsSttsArray(arrStr);
		rdmComPeraccVO.setInCheck("Y");
		rdmComPeraccVO.setMngInstCdSe(loginVO.getRoadMngInstCd());
		rdmComPeraccVO.setRegDtSe(vo.getRegDtSe());
		rdmComPeraccVO.setExseStpoDngCd(vo.getStdgEmdCdSe());
		rdmComPeraccVO.setBzentyNmSe(vo.getBzentyNmSe());
		rdmComPeraccVO.setCstrnNmSe(vo.getCstrnNmSe());
		rdmComPeraccVO.setRoadDggMngNmSe(vo.getRoadDggMngNmSe());
		rdmComPeraccVO.setRoadDggPrmsnNoSe(vo.getRoadDggPrmsnNoSe());
		rdmComPeraccVO.setCpfcDggBzentyNmSe(vo.getCpfcDggBzentyNmSe());
		rdmComPeraccVO.setRoadDggPrcsStts(vo.getRoadDggPrcsSttsSe());
		rdmComPeraccVO.setPageIndex(vo.getPageIndex());

		rdmComPeraccVO.setPageIndex(pageIndex);

		/*페이징*/
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(pageIndex);
		paginationInfo.setRecordCountPerPage(rdmComPeraccVO.getRecordCountPerPage());
		paginationInfo.setPageSize(rdmComPeraccVO.getPageSize());

		rdmComPeraccVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		rdmComPeraccVO.setLastIndex(paginationInfo.getLastRecordIndex());
		rdmComPeraccVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

        Map map = rdmComPeraccService.selectPeraccList(rdmComPeraccVO);

        int totCnt = Integer.parseInt(map.get("resultCnt").toString());
        paginationInfo.setTotalRecordCount(totCnt);

        List yearList = rdmComCodeService.getYearList("Y");
        List bjdCdeList = rdmComCodeService.selectDocdList("Y");

		model.addAttribute("resultList", map.get("resultList"));
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("searchVo", vo);
        model.addAttribute("yearList", yearList);
        model.addAttribute("bjdCdeList", bjdCdeList);

		return "res/rdm/dp/confirm/RdmDpConfirmL010";
	}

	/**
	 * @MethodDESC : 허가신청서 상세정보
	 */
	@RequestMapping(value = "/RdmDpConfirmR010.do")
	public String selectConfirm(@ModelAttribute("loginUser") LoginVO loginVO, @ModelAttribute RdmDpConfirmVO vo, ModelMap model)
	  throws Exception{

		String rdiIdn = vo.getRoadDggMngNo();

		//공사개요
		RdmComPerinfoVO perInfoVO = new RdmComPerinfoVO();
		perInfoVO.setRoadDggMngNo(rdiIdn);
		RdmComPerinfo perInfo = rdmComPerinfoService.selectPerinfo(perInfoVO);

		if(!loginVO.getRoadMngInstCd().equals(perInfo.getMngInstCd())){
			return "redirect:/rps/RdmDpConfirmL010.do";
		}

		//굴착예정지
		RdmComDigplanVO digplanVO = new RdmComDigplanVO();
		digplanVO.setRoadDggMngNo(rdiIdn);
		ArrayList digplanList = (ArrayList)rdmComDigplanService.selectDigplanList(digplanVO);

		//부과정보
		ArrayList levyList= (ArrayList)rdmDpConfirmService.selectLevyList(vo);
		
		//수납정보
		LevyAcceptVO lvo = new LevyAcceptVO();
		lvo.setLinkMngKey(rdiIdn);
		ArrayList rtList = (ArrayList)rdmDpLevyService.selectAcceptResult(lvo);

		model.addAttribute("perInfo", perInfo);
		model.addAttribute("digplanList", digplanList);
		model.addAttribute("levyList", levyList);
		model.addAttribute("rtList", rtList);
		model.addAttribute("searchVo", vo);

		return "res/rdm/dp/confirm/RdmDpConfirmR010";
	}

	/**
	 * @MethodDESC : 허가증등록
	 */
	@RequestMapping("/RdmDpConfirmC011.do")
    public String insertConfirm(@ModelAttribute("rdmDpConfirmVO") RdmDpConfirmVO vo) throws Exception {

		rdmDpConfirmService.insertConfirm(vo);

		return "";
    }

	/**
	 * @MethodDESC : 허가신청서 조회(출력)
	 */
	@RequestMapping(value = "/LayerPopRdmDpConfirmR020.do")
	public String selectConfirm(@RequestParam("roadDggMngNo") String roadDggMngNo, ModelMap model)
	  throws Exception{

		//공사개요
		RdmDpConfirmVO rdmDpConfirmVO = new RdmDpConfirmVO();
		rdmDpConfirmVO.setRoadDggMngNo(roadDggMngNo);
		RdmDpConfirm rdmDpConfirm = rdmDpConfirmService.selectConPrint(rdmDpConfirmVO);

		if(rdmDpConfirm.getRoadDggMngNo() != null){
			//자치단체장
			RdmOeGovoffVO rdmOeGovoffVO = new RdmOeGovoffVO();
			rdmOeGovoffVO.setMngInstCd(rdmDpConfirm.getMngInstCd());
			RdmOeGovoff govoff = rdmOeGovoffService.selectGovoff(rdmOeGovoffVO);
			rdmDpConfirm.setLclgvHed(govoff.getLclgvHed());
		}
		
		//일시점용
		RdmComDigsizeVO digSizeParam = new RdmComDigsizeVO();
		digSizeParam.setRoadDggMngNo(roadDggMngNo);

		ArrayList rdmComDigsizeList = (ArrayList)rdmComDigsizeService.selectDigsizeList(digSizeParam);

		String makDat = rdmDpConfirm.getRegDt();
		SimpleDateFormat transFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date to = transFormat.parse(makDat);
		
		SimpleDateFormat ymdFormat = new SimpleDateFormat( "yyyy 년   MM 월   dd일" );
		String ymd = ymdFormat.format(to);

		model.addAttribute("rdmDpConfirm",rdmDpConfirm);
		model.addAttribute("digsizeList",rdmComDigsizeList);
		model.addAttribute("ymd",ymd);

		return "res/rdm/dp/confirm/LayerPopRdmDpConfirmR020";
	}

	/**
	 * @MethodDESC : 허가증 조회(프린트)
	 */
	@RequestMapping(value = "/LayerPopRdmDpConfirmR030.do")
	public String selectPermit(@RequestParam("roadDggMngNo") String roadDggMngNo, ModelMap model)
	  throws Exception{

		//공사개요
		RdmDpConfirmVO rdmDpConfirmVO = new RdmDpConfirmVO();
		rdmDpConfirmVO.setRoadDggMngNo(roadDggMngNo);
		RdmDpConfirm rdmDpConfirm = rdmDpConfirmService.selectConPrint(rdmDpConfirmVO);

		if(rdmDpConfirm.getRoadDggMngNo() != null){
			//자치단체장
			RdmOeGovoffVO rdmOeGovoffVO = new RdmOeGovoffVO();
			rdmOeGovoffVO.setMngInstCd(rdmDpConfirm.getMngInstCd());
			RdmOeGovoff  govoff = rdmOeGovoffService.selectGovoff(rdmOeGovoffVO);
			rdmDpConfirm.setLclgvHed(govoff.getLclgvHed());
			rdmDpConfirm.setMnagcOcsl(govoff.getMnagcOcsl());
		}
		
		String pmtDat = rdmDpConfirm.getPrmsnDt();
		SimpleDateFormat transFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date to = transFormat.parse(pmtDat);
		
		SimpleDateFormat ymdFormat = new SimpleDateFormat( "yyyy 년   MM 월   dd 일" );
		String ymd = ymdFormat.format(to);

		model.addAttribute("rdmDpConfirm",rdmDpConfirm);
		model.addAttribute("ymd",ymd);

		return "res/rdm/dp/confirm/LayerPopRdmDpConfirmR030";
	}


	/**
	 * @MethodDESC : 협의의견
	 */
	@RequestMapping(value = "/LayerPopRdmDpConfirmR040.do")
	public String selectDiscuss(@ModelAttribute("rdmDpConfirmVO") RdmDpConfirmVO vo, ModelMap model)
	  throws Exception{

		String rdiIdn = vo.getRoadDggMngNo();
		//협의정보
		RdmComDiscussVO discussVO = new RdmComDiscussVO();
		discussVO.setRoadDggMngNo(rdiIdn);
		ArrayList discussList = (ArrayList)rdmComDiscussService.selectDiscussList(discussVO);

		model.addAttribute("discussList", discussList);
		model.addAttribute("searchVo", vo);

		return "res/rdm/dp/confirm/LayerPopRdmDpConfirmR040";
	}

	/**
	 * @MethodDESC : 납부 확인
	 */
	@RequestMapping("/RdmDpConfirmU020.do")
    public ResponseEntity<DefaultApiResponse<Map<String, Object>>> udateConfirm(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute RdmDpConfirmVO vo
	) throws Exception {

		try {
			vo.setUserAcntMngNo(loginVO.getUserUnqId());
			vo.setMngInstCd(loginVO.getRoadMngInstCd());
			vo.setRoadDggPrcsStts("RDH209");

			int result = rdmDpConfirmService.updateLevy(vo);

			Map<String, Object> resultMap = new HashMap<String, Object>();
			if (result > 0) {
				resultMap.put("result", result);
			} else {
				return ResponseEntity.badRequest().build();
			}
			return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
		}catch (IllegalStateException e) {
			log.error("납부 확인 중 오류가 발생했습니다.");
			return ResponseEntity.badRequest().build();
		}
    }

	/**
	 * @MethodDESC : 점용료부과로 되돌리기
	 */
	@RequestMapping("/RdmDpConfirmU090.do")
    public ResponseEntity<DefaultApiResponse<Map<String, Object>>> goBackPrevStep(
			@ModelAttribute RdmDpConfirmVO vo
	) throws Exception {

		try {
			String rdhCde = vo.getRoadDggPrcsStts();

			//허가대기나 허가 이면 이전 점용료부과 단계로 이동
			if("RDH208".equals(rdhCde) || "RDH209".equals(rdhCde)){
				vo.setRoadDggPrcsStts("RDH206");
				RdmDpLevyVO levyVO = new RdmDpLevyVO();
				levyVO.setRoadDggMngNo(vo.getRoadDggMngNo());
				rdmDpLevyService.deleteLevy(levyVO);
			}

			Map<String, Object> resultMap = new HashMap<String, Object>();

			int result = rdmDpConfirmService.goBackPrevStep(vo);
			if (result > 0) {
				resultMap.put("result", result);
			} else {
				return ResponseEntity.badRequest().build();
			}
			return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
		}catch (IllegalStateException e) {
			log.error("점용료 부과로 되돌리는 중 오류가 발생했습니다.");
			return ResponseEntity.badRequest().build();
		}
    }

}