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


import incheon.com.cmm.api.DefaultApiResponse;
import incheon.com.security.vo.LoginVO;
import incheon.res.app.code.service.UngisAppCodeService;
import incheon.res.app.code.service.UngisAppLgarCodeService;
import incheon.res.com.excel.web.CommonExcelView;
import incheon.res.com.util.ComDateUtil;
import incheon.res.rdm.com.code.service.RdmComCodeService;
import incheon.res.rdm.com.digplan.service.RdmComDigplanService;
import incheon.res.rdm.com.digplan.vo.*;
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.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.accept.service.RdmDpAcceptService;
import incheon.res.rdm.dp.accept.vo.RdmDpAcceptVO;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.egovframe.rte.fdl.cmmn.exception.EgovBizException;
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 org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.*;

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

	protected Log log = LogFactory.getLog(this.getClass());

	@Resource
    private RdmDpAcceptService rdmDpAcceptService;
	@Resource
    private RdmComPeraccService rdmComPeraccService;
	@Resource
    private RdmComPerinfoService rdmComPerinfoService;
	@Resource
    private RdmComDiscussService rdmComDiscussService;
	@Resource
    private RdmComDigsizeService rdmComDigsizeService;
	@Resource
    private RdmComDigplanService rdmComDigplanService;
	@Resource
    private RdmComCodeService rdmComCodeService;
    @Resource
    protected UngisAppLgarCodeService ungisAppLgarCodeService;
	@Resource
	private UngisAppCodeService ungisAppCodeService;
	@Resource(name = "propertiesService")
    protected EgovPropertyService propertiesService;

	/**
	 * @MethodDESC : 허가신청 리스트
	 */
	@RequestMapping(value = "/RdmDpAcceptL010.do")
	public String selectPerappList(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute RdmDpAcceptVO vo,
			@RequestParam(defaultValue = "1") int pageIndex,
			ModelMap model
	) throws Exception{

		RdmComPeraccVO rdmComPeraccVO = new RdmComPeraccVO();
		String[] arrStr ={"RDH104","RDH105"};
		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.setCpfcDggBzentyNmSe(vo.getCpfcDggBzentyNmSe());
		rdmComPeraccVO.setRoadDggMngNmSe(vo.getRoadDggMngNmSe());
		rdmComPeraccVO.setRoadDggPrcsStts(vo.getRoadDggPrcsSttsSe());

		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/accept/RdmDpAcceptL010";
	}


	/**
	 * @MethodDESC : 허가신청서를 조회한다.
	 */
	@RequestMapping(value = "/RdmDpAcceptR010.do")
	public String selectAccept(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute RdmDpAcceptVO vo,
			ModelMap model
	) throws Exception{

		//공사개요
		RdmComPerinfoVO perInfoVO = new RdmComPerinfoVO();
		perInfoVO.setRoadDggMngNo(vo.getRoadDggMngNo());
		perInfoVO.setUserAcntMngNo(loginVO.getUserUnqId());
		RdmComPerinfo perInfo = rdmComPerinfoService.selectPerinfo(perInfoVO);

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

		String rdiIdn = vo.getRoadDggMngNo();

		List guifCodeList = rdmComCodeService.selectGuifList("N");

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

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

		return "res/rdm/dp/accept/RdmDpAcceptR010";
	}
	
	
	/**
	 * @MethodDESC : 굴착예정지를 조회한다.(팝업)
	 */
	@RequestMapping(value = "/LayerPopRdmDpAcceptR090.do")
	public String selectDigPlan(@ModelAttribute RdmComDigplanVO vo, ModelMap model)
	  throws Exception{

		//도로정보
		RdmComDigplanVO result = rdmComDigplanService.selectAppgul(vo);

		result.setPnu(result.getPnu()+"@:@"+result.getIntsptMngNo());

		//일시점용
		RdmComDigsizeVO digSizeParam = new RdmComDigsizeVO();
		digSizeParam.setDggPstnMngNo(vo.getDggPstnMngNo());

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

		model.addAttribute("rdmComDigsizeList", rdmComDigsizeList);
		model.addAttribute("result", result);
		model.addAttribute("searchVo", vo);

		return "res/rdm/dp/accept/LayerPopRdmDpAcceptR090";
	}
	
	@RequestMapping(value = "/LayerPopRdmDpAcceptU090.do")
	public String updateAppgulView(@ModelAttribute RdmComDigplanVO vo, ModelMap model)
	  throws Exception{

        //bjdCde List
        List bjdList = ungisAppLgarCodeService.getLgarCodeList("N");
		//도로정보
		RdmComDigplanVO result = rdmComDigplanService.selectAppgul(vo);
		result.setPnu(result.getPnu()+"@:@"+result.getIntsptMngNo());

		//일시점용
		RdmComDigsizeVO digSizeParam = new RdmComDigsizeVO();
		digSizeParam.setDggPstnMngNo(vo.getDggPstnMngNo());
		
		ArrayList rdmComDigsizeList = (ArrayList)rdmComDigsizeService.selectDigsizeList(digSizeParam);

        //도로종류 ADA,RMT_DIPA_DT,N
        List adaList = ungisAppCodeService.getCodeList("ADA", "RMT_DIPA_DT", "N");

        //지하시설물 종류 UFA,RMT_DIPA_DT,N
        List ufaList = ungisAppCodeService.getCodeList("UFA", "RMT_DIPA_DT", "N");

        //도로복구방법 RRE,RMT_DIPA_DT,N
        List rreList = ungisAppCodeService.getCodeList("RRE", "RMT_DIPA_DT", "N");

        //포장종류 ADD,RMT_DIPP_DT,N
        List addList = ungisAppCodeService.getCodeList("ADD", "RMT_DIPP_DT", "N");

		model.addAttribute("bjdList",bjdList);
        model.addAttribute("adaList",adaList);
        model.addAttribute("ufaList",ufaList);
        model.addAttribute("rreList",rreList);
     	model.addAttribute("addList", addList);
		model.addAttribute("rdmComDigsizeList", rdmComDigsizeList);
		model.addAttribute("result", result);
        model.addAttribute("searchVo", vo);

        return "res/rdm/dp/accept/LayerPopRdmDpAcceptU090";
	}
	
	
	@RequestMapping(value = "/LayerPopRdmDpAcceptU091.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> updateAppgul(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute RdmComDigplanVO vo
	) throws Exception{

		try {
			int result = 0;

			String usrIdn = loginVO.getUserUnqId();
			String comIdn = loginVO.getRoadMngInstCd();

			String locIdn = vo.getIntsptMngNo().toString();
			if(locIdn == null || "".equals(locIdn)){
				throw new EgovBizException("굴착예정지 위치 정보가 부족합니다.");
			}

			vo.setCstrnClsf("WRK001");
			String dipIdn = vo.getDggPstnMngNo();

			vo.setBzentyInstMngNo(comIdn);
			vo.setUserAcntMngNo(usrIdn);
			if(vo.getLaneCnt() == null){
				vo.setLaneCnt(new BigDecimal(0));
			}

			//날짜 '-' 삭제
			String cosYmd = vo.getCstrnBgngYmd();
			if(!"".equals(cosYmd) && cosYmd != null){
				vo.setCstrnBgngYmd(cosYmd.replaceAll("-", ""));
			}

			//날짜 '-' 삭제
			String coeYmd = vo.getCstrnEndYmd();
			if(!"".equals(coeYmd) && coeYmd != null){
				vo.setCstrnEndYmd(coeYmd.replaceAll("-", ""));
			}

			//허가신청서 공사시기를 굴착예정지 공사기간으로 변경
			String cotDtm = ComDateUtil.dateToTimeStrWithComma(vo.getCstrnBgngYmd())+"~"+ComDateUtil.dateToTimeStrWithComma(vo.getCstrnEndYmd());
			vo.setCstrnEra(cotDtm);
			//사업예정지 일시점용 규모정보 리스트 입력
			List<RdmComDigplanList1VO> dataList1 = vo.getDataList1();

			if(dataList1.size() == 0) {
				throw new EgovBizException("한건 이상의 굴착상세내역을 입력하세요.");
			}

			ArrayList digPlanList1 = new ArrayList();
			for(int i =0; i < dataList1.size(); i++){

				RdmComDigplanList1VO listData = dataList1.get(i);

				String addCde1 = listData.getPackngKnd1();
				String appWid1 = listData.getAplyBt1();
				String appLen1 = listData.getAplyPrlg1();
				String appCnt1 = listData.getPipeCo1();

				RdmComDigsizeVO digSize = new RdmComDigsizeVO();

				if(!"".equals(addCde1) && !addCde1.equals(null)){
					digSize.setDggPstnMngNo(dipIdn);
					digSize.setPackngDsctnSn(new BigDecimal(i+1));
					//점용구분 PPS001 임시점용(사업예정지 규모정보에서 관리)
					digSize.setOcpatSe("PPS001");
					digSize.setPackngKnd(addCde1);
					digSize.setAplyBt(BigDecimal.valueOf(Double.parseDouble(appWid1)));
					digSize.setAplyPrlg(BigDecimal.valueOf(Double.parseDouble(appLen1)));
					digSize.setPipeCo(BigDecimal.valueOf(Double.parseDouble(appCnt1)));
					digPlanList1.add(digSize);
				}
			}


			//사업예정지 영구점용 규모정보 리스트 입력

			List<RdmComDigplanList2VO> dataList2 = vo.getDataList2();

			ArrayList digPlanList2 = new ArrayList();
			for(int i =0; i < dataList2.size(); i++){

				RdmComDigplanList2VO listData = dataList2.get(i);

				if(!"".equals(listData.getAplyDiam2()) || Double.parseDouble(listData.getAplyDiam2()) > 0){
					RdmComDigsizeVO digSize = new RdmComDigsizeVO();

					digSize.setDggPstnMngNo(dipIdn);
					digSize.setPackngDsctnSn(new BigDecimal(i+1));
					//점용구분 PPS001 임시점용(사업예정지 규모정보에서 관리)
					digSize.setOcpatSe("PPS002");
					digSize.setAplyDiam(strToBigDec(listData.getAplyDiam2()));
					digSize.setAplyPrlg(strToBigDec(listData.getAplyPrlg2()));
					digSize.setAplyDrctArea(strToBigDec(listData.getAplyDrctArea2()));
					digSize.setPipeCo(strToBigDec(listData.getPipeCo2()));
					digPlanList2.add(digSize);
				}
			}



			List<RdmComDigplanList3VO> dataList3 = vo.getDataList3();

			ArrayList digPlanList3 = new ArrayList();
			for(int i =0; i < dataList3.size(); i++){

				RdmComDigplanList3VO listData = dataList3.get(i);

				RdmComDigsizeVO digSize = new RdmComDigsizeVO();

				digSize.setDggPstnMngNo(dipIdn);
				digSize.setPackngDsctnSn(new BigDecimal(i+1));
				//점용구분 PPS001 임시점용(사업예정지 규모정보에서 관리)
				digSize.setOcpatSe("PPS003");
				digSize.setAplyPrlg(strToBigDec(listData.getAplyPrlg3()));
				digSize.setAplyBt(strToBigDec(listData.getAplyBt3()));
				digSize.setPipeCo(strToBigDec(listData.getPipeCo3()));

				digPlanList3.add(digSize);
			}

			result =  rdmComDigplanService.updateAppgul(vo, digPlanList1 ,digPlanList2,digPlanList3);

			Map<String, Object> resultMap = new HashMap<String, Object>();
			if(result > 0){
				resultMap.put("result","succ");
				resultMap.put("msg","성공");
			}else{
				return ResponseEntity.badRequest().build();
			}
			return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
		}catch (IllegalStateException e) {
			log.error("굴착예정지 수정 중 오류가 발생했습니다.");
			return ResponseEntity.badRequest().build();
		}
	}
	
	/**
	 * 굴착예정지 복제하기
	 */
	@RequestMapping(value = "/LayerPopRdmDpAcceptU092.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> separateAppgul(
			@ModelAttribute RdmComDigplanVO vo
	) throws Exception{

		try {
			String newDipIdn = rdmComDigplanService.selectNewDipidn(vo);

			int result = 0;
			vo.setNewDggPstnMngNo(newDipIdn);
			result = rdmComDigplanService.duplicateAppgul(vo);

			Map<String, Object> resultMap = new HashMap<String, Object>();
			if(result > 0){
				resultMap.put("result","succ");
				resultMap.put("msg","성공");
			}else{
				return ResponseEntity.badRequest().build();
			}
			return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
		}catch (IllegalStateException e) {
			log.error("굴착예정지 복제 중 오류가 발생했습니다.");
			return ResponseEntity.badRequest().build();
		}
	}
	
	private BigDecimal strToBigDec(String iStr){
		return  (iStr == null || "".equals(iStr))?new BigDecimal(0):new BigDecimal(iStr);
	}
	
	
	/**
	 * @MethodDESC : 보완요청
	 */
	@RequestMapping("/LayerPopRdmDpAcceptU010.do")
    public String updateAcceptrepletionView(@ModelAttribute RdmDpAcceptVO vo, ModelMap model) throws Exception {

		model.addAttribute("vo", vo);

		return "res/rdm/dp/accept/LayerPopRdmDpAcceptU010";
    }

	/**
	 * @MethodDESC : 보완요청
	 */
	@RequestMapping("/RdmDpAcceptU011.do")
    public ResponseEntity<DefaultApiResponse<Map<String, Object>>> updateAcceptrepletion(
			@ModelAttribute RdmDpAcceptVO vo
	) throws Exception {

		try {
			vo.setRoadDggPrcsStts("RDH105");

			int result = rdmDpAcceptService.updateAcceptrepletion(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("/RdmDpAcceptU012.do")
    public ResponseEntity<DefaultApiResponse<Map<String, Object>>> updateAccepcancel(
			@ModelAttribute RdmDpAcceptVO vo
	) throws Exception {

		try {
			vo.setRoadDggPrcsStts("RDH104");
			vo.setRcptBfrSplmntCn("");

			int result = rdmDpAcceptService.updateAcceptrepletion(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("/RdmDpAcceptU014.do")
    public ResponseEntity<DefaultApiResponse<Map<String, Object>>> changeAcceptMngCde(
			@ModelAttribute RdmDpAcceptVO vo
	) throws Exception {

		try {
			int result = rdmDpAcceptService.changeAcceptMngCde(vo);
			if(result > 0){
				result = rdmDpAcceptService.changeAcceptMngCdeDIPA(vo);
			}else{
				return ResponseEntity.badRequest().build();
			}

			Map<String, Object> resultMap = new HashMap<String, Object>();
			resultMap.put("result", result);

			return ResponseEntity.ok(DefaultApiResponse.success(resultMap));

		}catch (IllegalStateException e) {
			log.error("허가청 변경 중 오류가 발생했습니다.");
			return ResponseEntity.badRequest().build();
		}
    }

	/**
	 * @MethodDESC : 협의의견 조회
	 */
	@RequestMapping("/LayerPopRdmDpAcceptR020.do")
	public String selectDiscuss(@ModelAttribute RdmDpAcceptVO vo, ModelMap model)
	  throws Exception{

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

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

		return "res/rdm/dp/accept/LayerPopRdmDpAcceptR020";
	}
	

	@RequestMapping("/LayerPopRdmDpAcceptR020Excel.do")
	public ModelAndView selectDiscussExcel(@ModelAttribute RdmDpAcceptVO vo,
										   HttpServletRequest request,
										   HttpServletResponse response)
	  throws Exception{

		//협의 정보
		RdmComDiscussVO discussVO = new RdmComDiscussVO();
		discussVO.setRoadDggMngNo(vo.getRoadDggMngNo());
		List resultList = rdmComDiscussService.selectDiscussList(discussVO);

		LinkedHashMap<String, String> cellValue = new LinkedHashMap<String, String>();
		
		cellValue.put( "협의기관", "bzentyInstMngNm");
		cellValue.put( "전화번호", "cnsltnManTelNo");
		cellValue.put( "협의날짜", "cnsltnPrcsYmd");
		cellValue.put( "협의자", "cnsltnManNm");
		cellValue.put( "시설물유무", "fcltyYnNm");
		cellValue.put( "공사가능여부", "cnsltnRsltNm");
		cellValue.put( "협의의견", "cnsltnOpnn");

		Map<String, Object> model = new HashMap<>();
		model.put("resultList", resultList);
		model.put("cellValue", cellValue);
		model.put("excelTitle", "협의의견");

		//다운로드 완료 후 쿠키셋 (로딩바닫기)
		String token = request.getParameter("downloadToken");
		if (token != null && !token.isEmpty()) {
			javax.servlet.http.Cookie cookie = new javax.servlet.http.Cookie("fileDownloadToken",token);
			cookie.setPath("/");
			cookie.setHttpOnly(false);   // JS에서 읽어야 하므로 false
			cookie.setMaxAge(120);
			response.addCookie(cookie);
		}

		return new ModelAndView(new CommonExcelView(), model);
	}

	/**
	 * @MethodDESC : 시군구 민원접수
	 */
	@RequestMapping("/RdmDpAcceptU021.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> updateAcceptminwon(
			@ModelAttribute RdmDpAcceptVO vo
	) throws Exception{

		try {
			String message = rdmDpAcceptService.updateAcceptminwon(vo);

			Map<String, Object> resultMap = new HashMap<String, Object>();
			if(message.equals("succ")){
				resultMap.put("result","succ");
			}else{
				return ResponseEntity.badRequest().build();
			}
			return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
		}catch (IllegalStateException e) {
			log.error("민원 접수 중 오류가 발생했습니다.");
			return ResponseEntity.badRequest().build();
		}
	}

	/**
	 * @MethodDESC : 면제대상기관 허가신청서 접수(새올 접수 안함)
	 */
	@RequestMapping("/RdmDpAcceptU022.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> updateAcceptminwon2(
			@ModelAttribute RdmDpAcceptVO vo
	) throws Exception{

		try {
			vo.setRoadDggPrcsStts("RDH201");

			String message = rdmDpAcceptService.updateAcceptminwon2(vo);

			Map<String, Object> resultMap = new HashMap<String, Object>();
			if(message.equals("succ")){
				resultMap.put("result","succ");
			}else{
				return ResponseEntity.badRequest().build();
			}
			return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
		}catch (IllegalStateException e) {
			log.error("허가신청서 접수 중 오류가 발생했습니다.");
			return ResponseEntity.badRequest().build();
		}
	}
	
	

}