package incheon.res.rdm.dc.archamdaccess.web;


import incheon.com.cmm.ResponseCode;
import incheon.com.cmm.api.DefaultApiResponse;
import incheon.com.security.vo.LoginVO;
import incheon.res.app.code.service.UngisAppCodeService;
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.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.RdmComPerinfoVO;
import incheon.res.rdm.dc.archamd.vo.RdmDcArchamdVO;
import incheon.res.rdm.dc.archamdaccess.service.RdmDcArchamdaccessService;
import incheon.res.rdm.dp.confirm.service.RdmDpConfirmService;
import incheon.res.rdm.dp.confirm.vo.RdmDpConfirmVO;
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.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
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.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

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

    @Resource
    protected RdmDcArchamdaccessService rdmDcArchamdaccessService;
    @Resource
    protected RdmComPerinfoService rdmComPerinfoService;
    @Resource
    protected RdmComPeraccService rdmComPeraccService;
    @Resource
    protected RdmComDigsizeService rdmComDigsizeService;
    @Resource
    protected RdmComDigplanService rdmComDigplanService;
	@Resource
    protected RdmComCodeService rdmComCodeService;
	@Resource
	protected UngisAppCodeService ungisAppCodeService;
	@Resource
    private RdmDpConfirmService rdmDpConfirmService;
	@Resource(name = "propertiesService")
	protected EgovPropertyService propertiesService;


	/**
	 * @MethodDESC : 허가취소 가능 목록 조회
	 */
	@RequestMapping(value = "/RdmDcArchamdaccessL010.do")
	public String selectArchamdaccessList(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@RequestParam(defaultValue = "1") int pageIndex,
			@ModelAttribute("rdmDcArchamdVO") RdmDcArchamdVO vo,
			ModelMap model
	) throws Exception{

	    String sessionUserMngCde = loginVO.getRoadMngInstCd();

		RdmComPeraccVO peraccParam = new RdmComPeraccVO();

		vo.setPageIndex(pageIndex);

		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(pageIndex);
		paginationInfo.setRecordCountPerPage(vo.getRecordCountPerPage());
		paginationInfo.setPageSize(vo.getPageSize());

		peraccParam.setFirstIndex(paginationInfo.getFirstRecordIndex());
		peraccParam.setLastIndex(paginationInfo.getLastRecordIndex());
		peraccParam.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
        
        //공사변경 관련 코드
        String[] rdhCdeSe = {"RDH208", "RDH209", "RDH302", "RDH303", "RDH401","RDH402","RDH403","RDH404", "RDH406", "RDH904"}; //20160824 허가취소및삭제요청 추가
        peraccParam.setInCheck("Y");
        peraccParam.setRoadDggPrcsSttsArray(rdhCdeSe);
        peraccParam.setMngInstCdSe(sessionUserMngCde);
		peraccParam.setRegDtSe(vo.getRegDtSe());
		peraccParam.setExseStpoDngCd(vo.getStdgEmdCdSe());
		peraccParam.setBzentyNmSe(vo.getBzentyNmSe());
		peraccParam.setCstrnNmSe(vo.getCstrnNmSe());
		peraccParam.setRoadDggMngNmSe(vo.getRoadDggMngNmSe());
		peraccParam.setCpfcDggBzentyNmSe(vo.getCpfcDggBzentyNmSe());
		peraccParam.setRoadDggPrmsnNoSe(vo.getRoadDggPrmsnNoSe());
		
        Map<String, Object> resultMap = rdmComPeraccService.selectPeraccList(peraccParam);
		//허가취소 가능 목록 조회
        List resultList = (List)resultMap.get("resultList");
        //카운트 조회
        int resultCnt = (Integer)resultMap.get("resultCnt");

        paginationInfo.setTotalRecordCount(resultCnt);

        //년도
        List planYearList = rdmComCodeService.selectPlanYearList("Y");

        //법정동
        List docdList = rdmComCodeService.selectDocdList("Y");

        model.addAttribute("resultList", resultList);
        model.addAttribute("planYearList", planYearList);
        model.addAttribute("docdList", docdList);
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("searchVo", vo);

		return "res/rdm/dc/archamdaccess/RdmDcArchamdaccessL010";
	}

	/**
	 * @MethodDESC : 허가취소 완료 목록 조회
	 */
	@RequestMapping(value = "/RdmDcArchamdaccessL020.do")
	public String selectArchamdaccessList2(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@RequestParam(defaultValue = "1") int pageIndex,
			@ModelAttribute("rdmDcArchamdVO") RdmDcArchamdVO vo,
			ModelMap model
	) throws Exception{

		String sessionUserMngCde = loginVO.getRoadMngInstCd();

		RdmComPeraccVO peraccParam = new RdmComPeraccVO();

		vo.setPageIndex(pageIndex);

		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(pageIndex);
		paginationInfo.setRecordCountPerPage(vo.getRecordCountPerPage());
		paginationInfo.setPageSize(vo.getPageSize());

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

        //공사변경 관련 코드
        String[] rdhCdeSe = {"RDH907"};
        peraccParam.setInCheck("Y");
        peraccParam.setRoadDggPrcsSttsArray(rdhCdeSe);
        peraccParam.setMngInstCdSe(sessionUserMngCde);
        peraccParam.setRegDtSe(vo.getRegDtSe());
		peraccParam.setExseStpoDngCd(vo.getStdgEmdCdSe());
		peraccParam.setBzentyNmSe(vo.getBzentyNmSe());
		peraccParam.setCstrnNmSe(vo.getCstrnNmSe());
		peraccParam.setRoadDggMngNmSe(vo.getRoadDggMngNmSe());
		peraccParam.setCpfcDggBzentyNmSe(vo.getCpfcDggBzentyNmSe());
		peraccParam.setRoadDggPrmsnNoSe(vo.getRoadDggPrmsnNoSe());

        Map<String, Object> resultMap = rdmComPeraccService.selectPeraccList(peraccParam);
		//허가취소 가능 목록 조회
        List resultList = (List)resultMap.get("resultList");
        //카운트 조회
        int resultCnt = (Integer)resultMap.get("resultCnt");

        paginationInfo.setTotalRecordCount(resultCnt);

        //년도
        List planYearList = rdmComCodeService.selectPlanYearList("Y");

        //법정동
        List docdList = rdmComCodeService.selectDocdList("Y");

        model.addAttribute("resultList", resultList);
        model.addAttribute("planYearList", planYearList);
        model.addAttribute("docdList", docdList);
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("searchVo", vo);

		return "res/rdm/dc/archamdaccess/RdmDcArchamdaccessL020";
	}

	/**
	 * @MethodDESC : 허가취소 상세 조회
	 */
	@RequestMapping(value = "/RdmDcArchamdaccessR010.do")
	public String selectArchamdaccess(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute("rdmDcArchamdVO") RdmDcArchamdVO vo,
			ModelMap model)
	  throws Exception{
		String rdiIdn = vo.getRoadDggMngNo();

		//상세조회
		RdmComPerinfoVO rdmComPerinfoVO = null;
		RdmComPerinfoVO perinfoParam = new RdmComPerinfoVO();
		perinfoParam.setRoadDggMngNo(rdiIdn);
		
		try{
			rdmComPerinfoVO = rdmComPerinfoService.selectPerinfo(perinfoParam);
		}catch(RuntimeException e){
			log.error("해당 내용이 삭제되었거나 상태가 변경되어 요청내용을 처리 할 수 없습니다.");
		}

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

		//굴착규모
		RdmComDigsizeVO digsizeParam = new RdmComDigsizeVO();
		digsizeParam.setRoadDggMngNo(rdiIdn);
		List resultDigSize = rdmComDigsizeService.selectDigsizeList(digsizeParam);

		//굴착예정지
		RdmComDigplanVO digplanParam = new RdmComDigplanVO();
		digplanParam.setRoadDggMngNo(rdiIdn);
		List resultDigPlan = rdmComDigplanService.selectDigplanList(digplanParam);
		
		//부과정보
		RdmDpConfirmVO rdmDpConfirmVO = new RdmDpConfirmVO();
		rdmDpConfirmVO.setRoadDggMngNo(rdiIdn);
		ArrayList levyList= (ArrayList)rdmDpConfirmService.selectLevyList(rdmDpConfirmVO);
		model.addAttribute("levyList", levyList);

		model.addAttribute("rdmComPerinfoVO", rdmComPerinfoVO);
		model.addAttribute("resultDigSize", resultDigSize);
		model.addAttribute("resultDigPlan", resultDigPlan);
		model.addAttribute("searchVo", vo);

		return "res/rdm/dc/archamdaccess/RdmDcArchamdaccessR010";
	}

	/**
	 * @MethodDESC : 허가취소 상세 조회
	 */
	@RequestMapping(value = "/RdmDcArchamdaccessR020.do")
	public String selectArchamdaccess2(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute("rdmDcArchamdVO") RdmDcArchamdVO vo,
			ModelMap model)
	  throws Exception{

		String rdiIdn = vo.getRoadDggMngNo();

		//상세조회
		RdmComPerinfoVO rdmComPerinfoVO = null;
		RdmComPerinfoVO perinfoParam = new RdmComPerinfoVO();
		perinfoParam.setRoadDggMngNo(rdiIdn);
		try{
			rdmComPerinfoVO = rdmComPerinfoService.selectPerinfo(perinfoParam);
		}catch(RuntimeException e){
			log.error("해당 내용이 삭제되었거나 상태가 변경되어 요청내용을 처리 할 수 없습니다.");
		}

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

		//굴착규모
		RdmComDigsizeVO digsizeParam = new RdmComDigsizeVO();
		digsizeParam.setRoadDggMngNo(rdiIdn);
		List resultDigSize = rdmComDigsizeService.selectDigsizeList(digsizeParam);

		//굴착예정지
		RdmComDigplanVO digplanParam = new RdmComDigplanVO();
		digplanParam.setRoadDggMngNo(rdiIdn);
		List resultDigPlan = rdmComDigplanService.selectDigplanList(digplanParam);

		model.addAttribute("rdmComPerinfoVO", rdmComPerinfoVO);
		model.addAttribute("resultDigSize", resultDigSize);
		model.addAttribute("resultDigPlan", resultDigPlan);
		model.addAttribute("searchVo", vo);

		return "res/rdm/dc/archamdaccess/RdmDcArchamdaccessR020";
	}

	/**
	 * @MethodDESC : 허가취소 사유 등록 팝업
	 */
	@RequestMapping(value = "/LayerPopRdmDcArchamdaccessC010.do")
	public String insertArchamdaccessView(@ModelAttribute("rdmDcArchamdVO") RdmDcArchamdVO vo,
			ModelMap model, String pageId) throws Exception{

		//허가 취소 코드 목록
		List canCdeList = ungisAppCodeService.getCodeList("CAN","RMT_RDIG_MT","N");

		model.addAttribute("rdmDcArchamdVO", vo);
		model.addAttribute("canCdeList", canCdeList);
		model.addAttribute("pageId", pageId);
		
		return "res/rdm/dc/archamdaccess/LayerPopRdmDcArchamdaccessC010";
	}

	/**
	 * @MethodDESC : 허가 취소 처리
	 */
	@RequestMapping(value = "/RdmDcArchamdaccessC011.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> insertArchamdaccess(@ModelAttribute RdmDcArchamdVO vo,BindingResult bindingResult
	) throws Exception{

		if (bindingResult.hasErrors()) {
			Map<String, String> errors = new HashMap<>();
			bindingResult.getFieldErrors().forEach(error -> {
				String fieldName = error.getField();
				String errorMessage = error.getDefaultMessage();
				errors.put(fieldName, errorMessage);
			});

			DefaultApiResponse<Map<String, Object>> response = DefaultApiResponse.<Map<String, Object>>builder()
					.code(ResponseCode.INPUT_ERROR.getCode())
					.message("입력값 검증 오류가 발생했습니다.")
					.data((Map<String, Object>) (Object) errors)
					.timestamp(java.time.LocalDateTime.now())
					.error("ValidationException")
					.build();

			return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
		}

		int result = rdmDcArchamdaccessService.insertArchamdaccess(vo);

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

		return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
	}
	
	@RequestMapping(value = "/RdmDcArchamdaccessC012.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> insertArchamdaccessApproval(@ModelAttribute RdmDcArchamdVO vo, BindingResult bindingResult) throws Exception{

		if (bindingResult.hasErrors()) {
			Map<String, String> errors = new HashMap<>();
			bindingResult.getFieldErrors().forEach(error -> {
				String fieldName = error.getField();
				String errorMessage = error.getDefaultMessage();
				errors.put(fieldName, errorMessage);
			});

			DefaultApiResponse<Map<String, Object>> response = DefaultApiResponse.<Map<String, Object>>builder()
					.code(ResponseCode.INPUT_ERROR.getCode())
					.message("입력값 검증 오류가 발생했습니다.")
					.data((Map<String, Object>) (Object) errors)
					.timestamp(java.time.LocalDateTime.now())
					.error("ValidationException")
					.build();

			return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
		}

		int result = rdmDcArchamdaccessService.insertArchamdaccessApproval(vo);

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

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

	/**
	 * @MethodDESC : 취소 사유 수정 페이지 이동
	 */
	@RequestMapping(value = "/RdmDcArchamdaccessU010.do")
	public String updateArchamdaccessView(@ModelAttribute("rdmDcArchamdVO") RdmDcArchamdVO vo,
			ModelMap model) throws Exception{

		String rdiIdn = vo.getRoadDggMngNo();

		//상세조회
		RdmComPerinfoVO rdmComPerinfoVO = null;
		RdmComPerinfoVO perinfoParam = new RdmComPerinfoVO();
		perinfoParam.setRoadDggMngNo(rdiIdn);
		try{
			rdmComPerinfoVO = rdmComPerinfoService.selectPerinfo(perinfoParam);
		} catch(RuntimeException e){
			log.error("해당 내용이 삭제되었거나 상태가 변경되어 요청내용을 처리 할 수 없습니다.");
			throw new Exception(e);
		}

		//굴착규모
		RdmComDigsizeVO digsizeParam = new RdmComDigsizeVO();
		digsizeParam.setRoadDggMngNo(rdiIdn);
		List resultDigSize = rdmComDigsizeService.selectDigsizeList(digsizeParam);

		//굴착예정지
		RdmComDigplanVO digplanParam = new RdmComDigplanVO();
		digplanParam.setRoadDggMngNo(rdiIdn);
		List resultDigPlan = rdmComDigplanService.selectDigplanList(digplanParam);

		//허가 취소 코드 목록
		List canCdeList = ungisAppCodeService.getCodeList("CAN","RMT_RDIG_MT","N");

		model.addAttribute("rdmComPerinfoVO", rdmComPerinfoVO);
		model.addAttribute("resultDigSize", resultDigSize);
		model.addAttribute("resultDigPlan", resultDigPlan);
		model.addAttribute("canCdeList", canCdeList);
		model.addAttribute("searchVo", vo);
		model.addAttribute("rdmDcArchamdVO", vo);

		return "res/rdm/dc/archamdaccess/RdmDcArchamdaccessU010";
	}

	/**
	 * @MethodDESC : 허가 취소 사유 수정 처리
	 */
	@RequestMapping(value = "/RdmDcArchamdaccessU011.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> updateArchamdaccess(@ModelAttribute RdmDcArchamdVO vo,BindingResult bindingResult) throws Exception{

		if (bindingResult.hasErrors()) {
			Map<String, String> errors = new HashMap<>();
			bindingResult.getFieldErrors().forEach(error -> {
				String fieldName = error.getField();
				String errorMessage = error.getDefaultMessage();
				errors.put(fieldName, errorMessage);
			});

			DefaultApiResponse<Map<String, Object>> response = DefaultApiResponse.<Map<String, Object>>builder()
					.code(ResponseCode.INPUT_ERROR.getCode())
					.message("입력값 검증 오류가 발생했습니다.")
					.data((Map<String, Object>) (Object) errors)
					.timestamp(java.time.LocalDateTime.now())
					.error("ValidationException")
					.build();

			return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
		}

		int result = rdmDcArchamdaccessService.updateArchamdaccess(vo);

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

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