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


import com.fasterxml.jackson.databind.ObjectMapper;
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.code.vo.RdmComCodeVO;
import incheon.res.rdm.oe.perorg.service.RdmOePerorgService;
import incheon.res.rdm.oe.perorg.vo.RdmOePerorg;
import incheon.res.rdm.oe.perorg.vo.RdmOePerorgVO;
import incheon.res.rdm.oe.reqorg.vo.RdmOeReqorgVO;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.property.EgovPropertyService;
import org.egovframe.rte.psl.dataaccess.util.EgovMap;
import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import org.springframework.beans.factory.annotation.Autowired;
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.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Controller
@RequestMapping("${api.rps-path}")
@Slf4j
public class RdmOePerorgController {
    @Autowired private ObjectMapper objectMapper;

	@Resource
    private RdmOePerorgService rdmOePerorgService;
	@Resource
    protected RdmComCodeService rdmComCodeService;
	@Resource
	protected UngisAppCodeService ungisAppCodeService;
	@Resource(name = "propertiesService")
    protected EgovPropertyService propertiesService;

    
	/**
	 * @MethodDESC : 업체 목록 조회.
	 */
	@RequestMapping(value = "/RdmOePerorgL010.do")
	public String selectPerorgList(@ModelAttribute("loginUser") LoginVO loginVO,
								   @RequestParam(defaultValue = "1") int pageIndex,
								   @ModelAttribute("rdmOePerorgVO") RdmOePerorgVO vo, ModelMap model)
	  throws Exception{
		String sessionUserMngCde = loginVO.getRoadMngInstCd();
		vo.setMngInstCd(sessionUserMngCde);

		/*페이징*/
		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 = rdmOePerorgService.selectPerorgList(vo);

        model.addAttribute("resultList", resultList);

        int totCnt = rdmOePerorgService.countPerorg(vo);
        paginationInfo.setTotalRecordCount(totCnt);

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

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

        //면제종류 코드
        List exeCdeList = ungisAppCodeService.getCodeList("EXE", "RMT_COOG_DT", "Y");

        //업체상태 코드
        List ussCdeList = ungisAppCodeService.getCodeList("USS", "RMT_COOG_DT", "Y");

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

		return "res/rdm/oe/perorg/RdmOePerorgL010";
	}


	/**
	 * @MethodDESC : 업체정보 상세보기
	 */
	@RequestMapping("/RdmOePerorgR010.do")
    public String	selectPerorg(@ModelAttribute("rdmOePerorgVO") RdmOePerorgVO vo, ModelMap model) throws Exception {

		RdmOePerorg result = rdmOePerorgService.selectPerorg(vo);
		List copcRoleList = rdmOePerorgService.selectRmtCoguCt(vo);

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

        return "res/rdm/oe/perorg/RdmOePerorgR010";
    }

	/**
	 * @MethodDESC : 업체리스트 팝업
	 */
	@RequestMapping("/RdmOePerorgP010.do")
	public String selectPerorgListPopup(@ModelAttribute("loginUser") LoginVO loginVO,
										@RequestParam(defaultValue = "1") int pageIndex,
										@ModelAttribute RdmOePerorgVO vo, ModelMap model, String pageId)
			throws Exception{
		String sessionUserMngCde = loginVO.getRoadMngInstCd();
		vo.setMngInstCd(sessionUserMngCde);

		/*페이징*/
		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());

		int totCnt = rdmOePerorgService.countPerorgListPopup(vo);

        List resultList = rdmOePerorgService.selectPerorgListPopup(vo);

        paginationInfo.setTotalRecordCount(totCnt);

        //업체업종
        List tobCdeList = rdmComCodeService.selectApplicantTobList("Y");
        //상위기관
        List mngCdeList = rdmComCodeService.selectGuifList("N");

        model.addAttribute("mngCdeList", mngCdeList);
	    model.addAttribute("resultList", resultList);
	    model.addAttribute("tobCdeList", tobCdeList);
	    model.addAttribute("paginationInfo", paginationInfo);
	    model.addAttribute("searchVo", vo);
	    model.addAttribute("pageId", pageId);

		return "res/rdm/oe/perorg/LayerPopRdmOePerorgL010";
	}

	/**
	 * @MethodDESC : 업체 등록 하기위한 전 처리
	 */
	@RequestMapping("/RdmOePerorgC010.do")
    public String	insertPerorgView(@ModelAttribute("rdmOePerorgVO") RdmOePerorgVO vo, ModelMap model) throws Exception {

		//그룹구분 코드
		List gdiCdeList = rdmComCodeService.getCodeList("GDI", "RMT_COOG_DT", "N");
        //업체업종
        List tobCdeList = rdmComCodeService.selectApplicantTobList("N");
        //면제종류 코드
        List exeCdeList = ungisAppCodeService.getCodeList("EXE", "RMT_COOG_DT", "N");
        //업체상태 코드
        List ussCdeList = ungisAppCodeService.getCodeList("USS", "RMT_COOG_DT", "Y");
        //상위기관
        List mngCdeList = rdmComCodeService.selectGuifList(null);

        model.addAttribute("gdiCdeList", gdiCdeList);
        model.addAttribute("tobCdeList", tobCdeList);
        model.addAttribute("exeCdeList", exeCdeList);
        model.addAttribute("ussCdeList", ussCdeList);
        model.addAttribute("mngCdeList", mngCdeList);

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

        return "res/rdm/oe/perorg/RdmOePerorgC010";
    }


	/**
	 * @MethodDESC : 업체정보 등록
	 */
	@PostMapping(value = "/RdmOePerorgC011.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> insertPerorg(@ModelAttribute("loginUser") LoginVO loginVO, @ModelAttribute RdmOePerorgVO vo) throws Exception {


		String sessionUserId = loginVO.getUserUnqId();

		String comIdn = rdmOePerorgService.selectComIdn(vo);

		vo.setBzentyInstMngNo(comIdn);
		vo.setRegRqstr(sessionUserId);
		vo.setBzentyStts("USS002"); //최고관리자만이 업체를 등록하기 때문에 USS002 로 사용승인을 자동으로 줌

		rdmOePerorgService.insertRmtCoogDt(vo);

		rdmOePerorgService.deleteRmtCoguCt(vo);

		String pcpIdnSe = "";
		try{
			pcpIdnSe = vo.getUpBzentyInstMngNoSe().trim();
			String[] arrpcpIdnSe =  pcpIdnSe.split(" ");
			for(String pcpIdn : arrpcpIdnSe){
				if(pcpIdn.length() > 0){
					vo.setUpBzentyInstMngNo(pcpIdn);
					rdmOePerorgService.insertRmtCoguCt(vo);
				}
			}
		} catch (NullPointerException e) {
			log.error("데이터 입력 중 오류 발생", e);
			return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
		}

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

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


	/**
	 * @MethodDESC : 업체 수정화면 이동
	 */
	@RequestMapping("/RdmOePerorgU010.do")
    public String	updatePerorgView(@ModelAttribute("rdmOePerorgVO") RdmOePerorgVO vo, ModelMap model) throws Exception {

		RdmOePerorg result = rdmOePerorgService.selectPerorg(vo);

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

		//그룹구분 코드
		List gdiCdeList = rdmComCodeService.getCodeList("GDI", "RMT_COOG_DT", null);
        //업체업종
        List tobCdeList = rdmComCodeService.selectApplicantTobList("N");
        //면제종류 코드
        List exeCdeList = ungisAppCodeService.getCodeList("EXE", "RMT_COOG_DT", "N");
        //업체상태 코드
        List ussCdeList = ungisAppCodeService.getCodeList("USS", "RMT_COOG_DT", "Y");
        //상위기관
        List mngCdeList = rdmComCodeService.selectGuifList(null);
        //관할구권한
        List copcRoleList = rdmOePerorgService.selectRmtCoguCt(vo);

		String tobCdeListJson = objectMapper.writeValueAsString(tobCdeList);

		model.addAttribute("tobCdeListJson", tobCdeListJson);
		model.addAttribute("gdiCdeList", gdiCdeList);
        model.addAttribute("tobCdeList", tobCdeList);
        model.addAttribute("exeCdeList", exeCdeList);
        model.addAttribute("ussCdeList", ussCdeList);
        model.addAttribute("mngCdeList", mngCdeList);
        model.addAttribute("copcRoleList", copcRoleList);

        return "res/rdm/oe/perorg/RdmOePerorgU010";
    }

	/**
	 * @MethodDESC : 업체 수정
	 */
	@PostMapping(value = "/RdmOePerorgU011.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> updatePerorg(@ModelAttribute RdmOePerorgVO vo) throws Exception {

		rdmOePerorgService.updateRmtCoogDt(vo);

		rdmOePerorgService.deleteRmtCoguCt(vo);

		String pcpIdnSe = "";

		pcpIdnSe = vo.getUpBzentyInstMngNoSe().trim();
		String[] arrpcpIdnSe =  pcpIdnSe.split(" ");
		for(String pcpIdn : arrpcpIdnSe){
			if(pcpIdn.length() > 0){
				vo.setUpBzentyInstMngNo(pcpIdn);
				rdmOePerorgService.insertRmtCoguCt(vo);
			}
		}

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

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


	/**
	 * @MethodDESC : 일괄 사용승인
	 */
	@RequestMapping(value = "/RdmOePerorgU020.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> approvePerorgList(@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute RdmOePerorgVO vo) throws Exception{

		String sessionUserId = loginVO.getUserUnqId();

				//사용승인
		vo.setBzentyStts("USS002");
		vo.setAutzrId(sessionUserId);

		rdmOePerorgService.approvePerorgList(vo);

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

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

	/**
	 * @MethodDESC : 사용승인
	 */
	@PostMapping(value = "/RdmOePerorgU021.do" )
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> approvePerorg(@ModelAttribute("loginUser") LoginVO loginVO,
																				 @ModelAttribute RdmOePerorgVO vo) throws Exception {

		String sessionUserId = loginVO.getUserUnqId();

		//사용승인
		vo.setBzentyStts("USS002");
		vo.setAutzrId(sessionUserId);

		rdmOePerorgService.approvePerorg(vo);

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

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

	/**
	 * @MethodDESC : 일괄 사용취소
	 */
	@RequestMapping(value = "/RdmOePerorgU030.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> cancelPerorgList(@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute RdmOePerorgVO vo) throws Exception{

		String sessionUserId = loginVO.getUserUnqId();


		//사용취소
		vo.setBzentyStts("USS003");
		vo.setCnclrId(sessionUserId);

		rdmOePerorgService.cancelPerorgList(vo);

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

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

	/**
	 * @MethodDESC : 사용취소
	 */
	@PostMapping( value = "/RdmOePerorgU031.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> cancelPerorg(@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute RdmOePerorgVO vo) throws Exception {


		String sessionUserId = loginVO.getUserUnqId();

		//사용취소
		vo.setBzentyStts("USS003");
		vo.setCnclrId(sessionUserId);

		rdmOePerorgService.cancelPerorg(vo);

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

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

	/**
	 * @MethodDESC : 업체명 중복 체크
	 */
	@RequestMapping("/checkComNam.do")
    public ResponseEntity<DefaultApiResponse<Map<String, Object>>>	checkComNam( @Valid @RequestBody RdmOePerorgVO vo) throws Exception {

		String comNam ="";
		comNam = rdmOePerorgService.checkComNam(vo);

		Map<String, Object> resultMap = new HashMap<String, Object>();
		if(comNam.equals("N")){
			resultMap.put("result","succ");
		}else{
			resultMap.put("result","fail");
		}

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

	/**
	 * @MethodDESC : 내부협의 기관 목록조회
	 */
	@RequestMapping(value = "/RdmOePerorgMngP010.do")
	public String selectMngExpList(@ModelAttribute("RdmOeReqorgVO") RdmOeReqorgVO vo, ModelMap model, String pageId)
	  throws Exception{
		
		if(vo.getMngInstExplnSe()==null){
			vo.setMngInstExplnSe("");
		}

        RdmComCodeVO codeVO = new RdmComCodeVO();
        codeVO.setMngInstExpln(vo.getMngInstExplnSe());
        List resultList = rdmComCodeService.selectMngExpList(codeVO);

        model.addAttribute("resultList", resultList);

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

		return "res/rdm/oe/perorg/LayerPopRdmOePerorgMngP010";
	}

}