package incheon.ags.ias.comCd.web;

import incheon.ags.ias.comCd.service.ComCdService;
import incheon.ags.ias.comCd.vo.ComCdVO;
import incheon.ags.ias.comCd.vo.ComGroupCdVO;
import incheon.com.security.annotation.RequireRole;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * 공통코드 JSP Controller
 * 화면 렌더링용
 */
@Controller
@RequiredArgsConstructor
@Slf4j
@RequireRole(system = "AGS", roles = "ROLE_SUPER_ADMIN", description = "통합관리자 역할 접근 제어")
public class ComCdController {

    private final ComCdService comCdService;

    /**
     * 그룹코드 목록 화면
     */
    @GetMapping("/ags/ias/comCd/groupList.do")
    public String groupList(
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(required = false) String searchKeyword,
            @RequestParam(required = false) String useYn,
            ModelMap model) throws Exception {

        // 페이지네이션 설정
        ComGroupCdVO vo = new ComGroupCdVO();
        vo.setPageIndex(page);
        vo.setSearchKeyword(searchKeyword);
        vo.setUseYn(useYn);

        // 페이징 정보 세팅
        PaginationInfo paginationInfo = new PaginationInfo();
        paginationInfo.setCurrentPageNo(page);
        paginationInfo.setRecordCountPerPage(vo.getRecordCountPerPage());
        paginationInfo.setPageSize(vo.getPageSize());

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

        // 그룹코드 리스트
        List<ComGroupCdVO> groupCdList = comCdService.selectComGroupCdList(vo);

        // 검색 조건이 적용된 총 카운트
        ComGroupCdVO totalCntResult = comCdService.selectComGroupCdTotalCnt(vo);
        int totalCount = totalCntResult.getTotalCount();

        paginationInfo.setTotalRecordCount(totalCount);

        // 사용/미사용 총 카운트 (전체 통계용)
        ComGroupCdVO useCntMap = comCdService.selectComGroupCdListUseCnt();

        model.addAttribute("groupCdList", groupCdList);
        model.addAttribute("totalCount", totalCount);
        model.addAttribute("useCnt", useCntMap.getUseCount());
        model.addAttribute("notUseCnt", useCntMap.getNotUseCount());
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("searchKeyword", searchKeyword);
        model.addAttribute("useYn", useYn);

        return "ags/ias/comCd/groupList";
    }

    /**
     * 그룹코드 상세 화면
     */
    @GetMapping("/ags/ias/comCd/groupDetail.do")
    public String groupDetail(
            @RequestParam("groupCd") String groupCd,
            ModelMap model) throws Exception {

        ComGroupCdVO detail = comCdService.selectComGroupCdDetail(groupCd);
        List<ComCdVO> cdList = comCdService.getComCdByGroupCd(groupCd);

        model.addAttribute("groupCdDetail", detail);
        model.addAttribute("cdList", cdList);

        return "ags/ias/comCd/groupDetail";
    }

    /**
     * 그룹코드 등록 화면
     */
    @GetMapping("/ags/ias/comCd/groupRegist.do")
    public String groupRegist() {
        return "ags/ias/comCd/groupRegist";
    }

    /**
     * 그룹코드 수정 화면
     */
    @GetMapping("/ags/ias/comCd/groupModify.do")
    public String groupModify(
            @RequestParam String groupCd,
            ModelMap model) throws Exception {

        ComGroupCdVO groupCdDetail = comCdService.selectComGroupCdDetail(groupCd);
        model.addAttribute("groupCdDetail", groupCdDetail);

        return "ags/ias/comCd/groupModify";
    }

    /**
     * 상세코드 등록/수정 화면
     */
    @GetMapping("/ags/ias/comCd/cdDetail.do")
    public String cdDetail(
            @RequestParam(value = "groupCd", required = false) String groupCd,
            @RequestParam(value = "cd", required = false) String cd,
            @RequestParam(value = "mode", defaultValue = "create") String mode,
            ModelMap model) throws Exception {

        try {
            // 그룹코드 전체 목록 (셀렉트박스용)
            ComGroupCdVO groupVO = new ComGroupCdVO();
            groupVO.setRecordCountPerPage(1000); // 전체 조회
            groupVO.setFirstIndex(0);
            List<ComGroupCdVO> groupList = comCdService.selectComGroupCdList(groupVO);
            model.addAttribute("groupList", groupList);

            // 수정 모드인 경우 상세코드 조회
            if ("edit".equals(mode) && StringUtils.hasText(groupCd) && StringUtils.hasText(cd)) {
                ComCdVO cdDetail = comCdService.getComCdDetail(groupCd, cd);

                if (cdDetail != null) {
                    model.addAttribute("cdDetail", cdDetail);
                    model.addAttribute("mode", "edit");
                } else {
                    log.error("해당 상세코드를 찾을 수 없습니다. groupCd: {}, cd: {}", groupCd, cd);
                    model.addAttribute("mode", "create");
                    model.addAttribute("errorMessage", "해당 상세코드를 찾을 수 없어 등록 모드로 전환됩니다.");

                    if (StringUtils.hasText(groupCd)) {
                        model.addAttribute("selectedGroupCd", groupCd);
                    }
                }
            } else {
                // 등록 모드
                model.addAttribute("mode", "create");
                if (StringUtils.hasText(groupCd)) {
                    model.addAttribute("selectedGroupCd", groupCd);
                }
            }

        } catch (Exception e) {
            log.error("cdDetail 페이지 처리 중 오류 발생", e);
            model.addAttribute("mode", "create");
            model.addAttribute("errorMessage", "페이지 로딩 중 오류가 발생했습니다: " + e.getMessage());
        }

        return "ags/ias/comCd/cdDetail";
    }

    /**
     * 상세코드 등록/수정 팝업 화면 (레이어팝업용)
     */
    @GetMapping("/ags/ias/comCd/cdDetailPopup.do")
    public String cdDetailPopup(
            @RequestParam("groupCd") String groupCd,
            @RequestParam(value = "cd", required = false) String cd,
            @RequestParam(value = "mode", defaultValue = "create") String mode,
            ModelMap model) throws Exception {

        try {
            model.addAttribute("groupCd", groupCd);
            model.addAttribute("mode", mode);

            // 수정 모드인 경우 상세코드 조회
            if ("edit".equals(mode) && StringUtils.hasText(cd)) {
                ComCdVO cdDetail = comCdService.getComCdDetail(groupCd, cd);

                if (cdDetail != null) {
                    model.addAttribute("cdDetail", cdDetail);
                } else {
                    log.error("해당 상세코드를 찾을 수 없습니다. groupCd: {}, cd: {}", groupCd, cd);
                    model.addAttribute("mode", "create");
                    model.addAttribute("errorMessage", "해당 상세코드를 찾을 수 없어 등록 모드로 전환됩니다.");
                }
            }

        } catch (Exception e) {
            log.error("cdDetailPopup 처리 중 오류 발생", e);
            model.addAttribute("mode", "create");
            model.addAttribute("errorMessage", "팝업 로딩 중 오류가 발생했습니다: " + e.getMessage());
        }

        return "ags/ias/comCd/cdDetailPopup";
    }

}
