package incheon.res.rdm.oe.reqorg.web;

import incheon.com.cmm.ComDefaultVO;
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.oe.perorg.service.RdmOePerorgService;
import incheon.res.rdm.oe.perorg.vo.RdmOePerorgVO;
import incheon.res.rdm.oe.reqorg.service.RdmOeReqorgService;
import incheon.res.rdm.oe.reqorg.vo.RdmOeReqorg;
import incheon.res.rdm.oe.reqorg.vo.RdmOeReqorgVO;
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.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@SessionAttributes(types = ComDefaultVO.class)
@RequestMapping("${api.rps-path}")
public class RdmOeReqorgController{
	
	@Resource
    private RdmOePerorgService rdmOePerorgService;

	@Resource
    private RdmOeReqorgService rdmOeReqorgService;

    @Resource(name = "propertiesService")
    protected EgovPropertyService propertiesService;

    @Resource
    protected UngisAppCodeService ungisAppCodeService;

    @Resource
    protected RdmComCodeService rdmComCodeService;



	/**
	 * @MethodDESC : 해당 허가청 관할 업체 리스트 (유관기관) - 필수 협의기관 구분
	 */
	@RequestMapping(value = "/RdmOeReqorgL010.do")
	public String selectReqorgList(@ModelAttribute("loginUser") LoginVO loginVO, @RequestParam(defaultValue = "1") int pageIndex, @ModelAttribute RdmOeReqorgVO vo, ModelMap model)
	  throws Exception{

		vo.setMngInstCd(loginVO.getRoadMngInstCd());

		/*페이징*/
		vo.setPageIndex(pageIndex);

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

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

		List resultList = rdmOeReqorgService.selectReqorgList(vo);

        model.addAttribute("resultList", resultList);

        int totCnt = rdmOeReqorgService.countReqorg(vo);
        paginationInfo.setTotalRecordCount(totCnt);

        //그룹구분 코드
        List gdiCdeList = ungisAppCodeService.getCodeList("GDI", "RMT_COOG_DT", "Y");

        //업체업종
        List tobCdeList = rdmComCodeService.selectApplicantTobList("Y");

        model.addAttribute("gdiCdeList", gdiCdeList);
        model.addAttribute("tobCdeList", tobCdeList);
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("searchVo", vo);

		return "res/rdm/oe/reqorg/RdmOeReqorgL010";
	}


	/**
	 * @MethodDESC : 업체정보 상세조회 - 필수협의기관 상세보기
	 */
	@RequestMapping("/RdmOeReqorgR010.do")
    public String	selectReqorg(@ModelAttribute("loginUser") LoginVO loginVO,@ModelAttribute("rdmOeReqorgVO") RdmOeReqorgVO vo,
            ModelMap model) throws Exception {

		vo.setMngInstCd(loginVO.getRoadMngInstCd());

		RdmOeReqorg result = rdmOeReqorgService.selectReqorg(vo);

		/*if(!loginVO.getRoadMngInstCd().equals(result.getMngInstCd())){
			return "redirect:/rps/RdmOeReqorgL010.do";
		}*/
		
		RdmOePerorgVO voPer = new RdmOePerorgVO();
		voPer.setBzentyInstMngNo(vo.getBzentyInstMngNo());
		List copcRoleList = rdmOePerorgService.selectRmtCoguCt(voPer);

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

        return "res/rdm/oe/reqorg/RdmOeReqorgR010";
    }


	/**
	 * @MethodDESC : 필수협의기관 등록(one)
	 */
	@PostMapping(value = "/RdmOeReqorgC011.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> approveReqorg(@ModelAttribute("loginUser") LoginVO loginVO, @ModelAttribute RdmOeReqorgVO 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);
		}

		vo.setRgtrId(loginVO.getUserId());
		vo.setMngInstCd(loginVO.getRoadMngInstCd());

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

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

    }


	/**
	 * @MethodDESC : 필수협의기관 등록(list)
	 */
	@RequestMapping(value="/RdmOeReqorgC012.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> approveReqorgList(@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute RdmOeReqorgVO 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);
		}
		vo.setRgtrId(loginVO.getUserId());
		vo.setMngInstCd(loginVO.getRoadMngInstCd());

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

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

    }

	/**
	 * @MethodDESC : 필수협의기관 해제(one)
	 */
	@PostMapping( value = "/RdmOeReqorgD011.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> rejectReqorg(@ModelAttribute("loginUser") LoginVO loginVO, @ModelAttribute RdmOeReqorgVO 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);
		}

		vo.setRgtrId(loginVO.getUserId());
		vo.setMngInstCd(loginVO.getRoadMngInstCd());

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

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

	/**
	 * @MethodDESC : 필수협의기관 해제(list)
	 */
	@RequestMapping(value="/RdmOeReqorgD012.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> rejectReqorgList(@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute RdmOeReqorgVO 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);
		}

		vo.setRgtrId(loginVO.getUserId());
		vo.setMngInstCd(loginVO.getRoadMngInstCd());

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

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

}