package incheon.res.rdm.cs.roadlaws.web;


import incheon.com.cmm.ResponseCode;
import incheon.com.cmm.api.DefaultApiResponse;
import incheon.com.cmm.exception.BusinessException;
import incheon.com.security.vo.LoginVO;
import incheon.res.rdm.com.attachfile.service.RdmComAttachfileService;
import incheon.res.rdm.com.attachfile.service.RdmFileMngUtil;
import incheon.res.rdm.com.attachfile.vo.RdmComAttachfileVO;
import incheon.res.rdm.cs.roadlaws.service.RdmCsRoadlawsService;
import incheon.res.rdm.cs.roadlaws.vo.RdmCsRoadlaws;
import incheon.res.rdm.cs.roadlaws.vo.RdmCsRoadlawsVO;
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.MediaType;
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 org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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

	@Resource
    private RdmCsRoadlawsService rdmCsRoadlawsService;
	@Resource
    private RdmComAttachfileService rdmComAttachfileService;
	@Resource(name="RdmFileMngUtil")
	private RdmFileMngUtil fileUtil;
	@Resource(name = "propertiesService")
	protected EgovPropertyService propertiesService;


	/**
	 * 도로굴착 관련법규 목록화면 이동
	 * @param page
	 * @param vo
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/RdmCsRoadlawsL010.do")
	public String selectRoadlawsList(
			@RequestParam(defaultValue = "1") int pageIndex,
			@ModelAttribute("rdmCsRoadlawsVO") RdmCsRoadlawsVO vo,
			ModelMap model)
	  throws Exception{

		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 roadlawsList = rdmCsRoadlawsService.selectRoadlawsList(vo);

		int totCnt = rdmCsRoadlawsService.countRoadlaws(vo);
        paginationInfo.setTotalRecordCount(totCnt);

        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("roadlawsList", roadlawsList);
        model.addAttribute("searchVo", vo);

		return "res/rdm/cs/roadlaws/RdmCsRoadlawsL010";
	}

	/**
	 * 도로굴착 관련법규 상세화면 이동
	 * @param vo
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/RdmCsRoadlawsR010.do")
	public String selectRoadlaws(@ModelAttribute("rdmCsRoadlawsVO") RdmCsRoadlawsVO vo, ModelMap model)
	  throws Exception{

		RdmCsRoadlaws rdmCsRoadlaws = rdmCsRoadlawsService.selectRoadlaws(vo);

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

		//조회 카운트 증가
		rdmCsRoadlawsService.insertCount(vo);

		return "res/rdm/cs/roadlaws/RdmCsRoadlawsR010";
	}

	/**
	 * 도로굴착 관련법규 등록화면 이동
	 * @param vo
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/RdmCsRoadlawsC010.do")
	public String insertRoadlawsView(@ModelAttribute("rdmCsRoadlawsVO") RdmCsRoadlawsVO vo, ModelMap model)
	  throws Exception{

		RdmCsRoadlawsVO rdmCsRoadlawsVO = new RdmCsRoadlawsVO();
		model.addAttribute("rdmCsRoadlawsVO", rdmCsRoadlawsVO);
		model.addAttribute("searchVo", vo);

		return "res/rdm/cs/roadlaws/RdmCsRoadlawsC010";
	}

	/**
	 * 도로굴착 관련법규 등록
	 * @param request
	 * @param multiRequest
	 * @param vo
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/RdmCsRoadlawsC011.do", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> insertRoadlaws(
			@ModelAttribute("loginUser") LoginVO loginVO,
			HttpServletRequest request,
			final MultipartHttpServletRequest multiRequest,
			@ModelAttribute RdmCsRoadlawsVO vo
	) throws Exception{

		//SEQ 값
		String dggSttSn = rdmCsRoadlawsService.getMaxprdSeq(vo);

		vo.setDggSttSn(dggSttSn);
		vo.setRgtrId(loginVO.getUserUnqId());

		int lawsCnt = rdmCsRoadlawsService.selectCheck(vo);

		if(lawsCnt > 0){
			throw new BusinessException("동일 법령명이 존재합니다.",HttpStatus.INTERNAL_SERVER_ERROR);
		}else{
			// 첨부파일 관련 첨부파일ID 생성
			List<RdmComAttachfileVO> _result = null;

			final Map<String, MultipartFile> files = multiRequest.getFileMap();
			if(!files.isEmpty()){
				_result = fileUtil.parseFileInf(request, files, vo.getDggSttSn(), "RMT_LAWS_DT", null);

				Iterator iter = _result.iterator();
				while (iter.hasNext()) {
					rdmComAttachfileService.insertAttachfile((RdmComAttachfileVO)iter.next());
				}
			}

			rdmCsRoadlawsService.insertRoadlaws(vo);
		}

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

		resultMap.put("dggSttSn",dggSttSn);

		return ResponseEntity.ok(DefaultApiResponse.success(resultMap, "저장 완료되었습니다."));
	}

	/**
	 * 도로굴착 관련법규 수정화면 이동
	 * @param vo
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/RdmCsRoadlawsU010.do")
	public String updateRoadlawsView(@ModelAttribute("rdmCsRoadlawsVO") RdmCsRoadlawsVO vo, ModelMap model)
	  throws Exception{

		//하자보수 조치 내역 조회
		RdmCsRoadlaws rdmCsRoadlaws = rdmCsRoadlawsService.selectRoadlaws(vo);

        model.addAttribute("rdmCsRoadlawsVO", rdmCsRoadlaws);
        model.addAttribute("searchVo", vo);

		return "res/rdm/cs/roadlaws/RdmCsRoadlawsU010";
	}

	/**
	 * 도로굴착 관련법규 수정
	 * @param request
	 * @param multiRequest
	 * @param vo
	 * @param bindingResult
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/RdmCsRoadlawsU011.do", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> updateRoadlaws(
			HttpServletRequest request,
			final MultipartHttpServletRequest multiRequest,
			@ModelAttribute RdmCsRoadlawsVO vo,
			@ModelAttribute("loginUser") LoginVO loginVO,
			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.setMdfrId(loginVO.getUserUnqId());

		int cnt = 0;
		int lawsCnt = rdmCsRoadlawsService.selectCheck(vo);

		if(lawsCnt > 0){
			throw new BusinessException("동일 법령명이 존재합니다.",HttpStatus.INTERNAL_SERVER_ERROR);
		}else{

			// 첨부파일 관련 첨부파일ID 생성
			List<RdmComAttachfileVO> _result = null;

			final Map<String, MultipartFile> files = multiRequest.getFileMap();
			if(!files.isEmpty()){
			 	_result = fileUtil.parseFileInf(request, files, vo.getDggSttSn(), "RMT_LAWS_DT", null);

				Iterator iter = _result.iterator();
				while (iter.hasNext()) {
					rdmComAttachfileService.insertAttachfile((RdmComAttachfileVO)iter.next());
				}
			}

			cnt = rdmCsRoadlawsService.updateRoadlaws(vo);

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

		if(cnt > 0){
			resultMap.put("result","succ");
		}else{
			throw new BusinessException("법규 수정을 실패했습니다. ",HttpStatus.INTERNAL_SERVER_ERROR);
		}

		return ResponseEntity.ok(DefaultApiResponse.success(resultMap, "법규가 수정 되었습니다."));
	}

	/**
	 * 도로굴착 관련법규 삭제
	 * @param vo
	 * @param bindingResult
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/RdmCsRoadlawsD011.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> deleteRoadlaws(
			@ModelAttribute RdmCsRoadlawsVO 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);
		}

		RdmComAttachfileVO rdmComAttarchfileVO = new RdmComAttachfileVO();
		rdmComAttarchfileVO.setTblNam("RMT_LAWS_DT");
		rdmComAttarchfileVO.setDatSeq(vo.getDggSttSn());

		rdmComAttachfileService.deleteAttachfileAll(rdmComAttarchfileVO);

		int cnt = rdmCsRoadlawsService.deleteRoadlaws(vo);

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

		if(cnt > 0){
			resultMap.put("result","succ");
		}else{
			throw new BusinessException("삭제를 실패했습니다. ",HttpStatus.INTERNAL_SERVER_ERROR);
		}

		return ResponseEntity.ok(DefaultApiResponse.success(resultMap, "삭제 되었습니다."));
	}



}