package incheon.ags.ias.srvy.srvyQitem.web;

import incheon.ags.ias.srvy.srvyQitem.service.SrvyQitemService;
import incheon.ags.ias.srvy.srvyQitem.vo.SrvyQitemVO;
import incheon.ags.ias.srvy.srvyQitem.vo.SrvyQitemSearchVO;
import incheon.ags.ias.srvy.srvyQitemArtcl.service.SrvyQitemArtclService;
import incheon.ags.ias.srvy.srvyQitemArtcl.vo.SrvyQitemArtclVO;
import incheon.ags.ias.srvy.srvyQitemArtcl.vo.SrvyQitemArtclSearchVO;
import incheon.ags.ias.srvy.srvy.service.SrvyService;
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.web.bind.annotation.*;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Map;

/**
 * 설문 문항 관리 Controller
 * - 설문 문항 정보 관리 웹 페이지
 */
@Controller
@RequiredArgsConstructor
@Slf4j
@RequireRole(system = "AGS", roles = "ROLE_SUPER_ADMIN", description = "통합관리자 역할 접근 제어")
public class SrvyQitemController {
    private final SrvyQitemService srvyQitemService;
    private final SrvyQitemArtclService srvyQitemArtclService;
    private final SrvyService srvyService;

    /**
     * 설문 문항 목록 조회
     */
    @GetMapping("/ags/ias/srvyQitem/srvyQitemList.do")
    public String srvyQitemList(
            @RequestParam(defaultValue = "1") int page,
            @ModelAttribute SrvyQitemSearchVO searchVO,
            ModelMap model) throws Exception {


        searchVO.setPageIndex(page);

        PaginationInfo paginationInfo = new PaginationInfo();
        paginationInfo.setCurrentPageNo(page);
        paginationInfo.setRecordCountPerPage(searchVO.getRecordCountPerPage());
        paginationInfo.setPageSize(searchVO.getPageSize());

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

        int totalCount = srvyQitemService.selectSrvyQitemListTotCnt(searchVO);
        model.addAttribute("totalCount", totalCount);
        paginationInfo.setTotalRecordCount(totalCount);

        List<SrvyQitemVO> srvyQitemList = srvyQitemService.selectSrvyQitemList(searchVO);
        model.addAttribute("srvyQitemList", srvyQitemList);
        model.addAttribute("searchVO", searchVO);
        model.addAttribute("paginationInfo", paginationInfo);

        return "/ags/ias/srvy/srvyQitem/srvyQitemList";
    }

    /**
     * 설문 문항 등록 페이지
     */
    @GetMapping("/ags/ias/srvyQitem/srvyQitemRegist.do")
    public String srvyQitemRegist(
            @RequestParam(value = "srvySn", required = false) String srvySn,
            ModelMap model) throws Exception {

        List<Map<String, Object>> surveyList = srvyQitemService.selectSrvy();
        model.addAttribute("surveyList", surveyList);
        model.addAttribute("srvySn", srvySn);

        return "/ags/ias/srvy/srvyQitem/srvyQitemRegist";
    }


    /**
     * 설문 문항 상세 조회
     */
    @GetMapping("/ags/ias/srvyQitem/srvyQitemDetail.do")
    public String srvyQitemDetail(
            @RequestParam(value = "srvyQitemSn", required = false) String srvyQitemSn,
            ModelMap model) throws Exception {

        SrvyQitemVO vo = new SrvyQitemVO();
        vo.setQitemSn(Integer.parseInt(srvyQitemSn));
        SrvyQitemVO srvyQitemDetail = srvyQitemService.selectSrvyQitemDetail(vo);
        model.addAttribute("resultList", srvyQitemDetail);

        // 해당 문항의 선택지 목록 조회
        SrvyQitemArtclSearchVO artclSearchVO = new SrvyQitemArtclSearchVO();
        artclSearchVO.setQitemSn(Integer.parseInt(srvyQitemSn));
        // 페이지네이션 설정 (전체 목록을 가져오기 위해 큰 값으로 설정)
        artclSearchVO.setRecordCountPerPage(1000);
        artclSearchVO.setFirstIndex(0);
        List<SrvyQitemArtclVO> artclList = srvyQitemArtclService.selectSrvyQitemArtclList(artclSearchVO);
        model.addAttribute("artclList", artclList);

        return "/ags/ias/srvy/srvyQitem/srvyQitemDetail";
    }

    /**
     * 설문 문항 수정 페이지
     */
    @GetMapping("/ags/ias/srvyQitem/srvyQitemModify.do")
    public String srvyQitemModify(
            @RequestParam(value = "srvyQitemSn", required = false) String srvyQitemSn,
            ModelMap model) throws Exception {

        SrvyQitemVO vo = new SrvyQitemVO();
        vo.setQitemSn(Integer.parseInt(srvyQitemSn));
        SrvyQitemVO srvyQitemDetail = srvyQitemService.selectSrvyQitemDetail(vo);
        model.addAttribute("resultList", srvyQitemDetail);

        List<Map<String, Object>> surveyList = srvyQitemService.selectSrvy();
        model.addAttribute("surveyList", surveyList);

        return "/ags/ias/srvy/srvyQitem/srvyQitemModify";
    }

    /**
     * 설문 문항 등록/수정 팝업 화면 (레이어팝업용)
     */
    @GetMapping("/ags/ias/srvyQitem/srvyQitemDetailPopup.do")
    public String srvyQitemDetailPopup(
            @RequestParam("srvySn") String srvySn,
            @RequestParam(value = "srvyQitemSn", required = false) String srvyQitemSn,
            @RequestParam(value = "mode", defaultValue = "create") String mode,
            ModelMap model) throws Exception {

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

            // 해당 설문의 기존 문항 순번 목록 조회 (중복 검증용)
            List<Map<String, Object>> existingQitemList = srvyService.selectSrvyQitemListBySrvySn(Integer.parseInt(srvySn));
            model.addAttribute("existingQitemList", existingQitemList);

            // 수정 모드인 경우 문항 상세 조회
            if ("edit".equals(mode) && StringUtils.hasText(srvyQitemSn)) {
                SrvyQitemVO vo = new SrvyQitemVO();
                vo.setQitemSn(Integer.parseInt(srvyQitemSn));
                SrvyQitemVO srvyQitemDetail = srvyQitemService.selectSrvyQitemDetail(vo);

                if (srvyQitemDetail != null) {
                    model.addAttribute("srvyQitemDetail", srvyQitemDetail);
                    
                    // 해당 문항의 선택지 목록 조회
                    try {
                        SrvyQitemArtclSearchVO artclSearchVO = new SrvyQitemArtclSearchVO();
                        artclSearchVO.setQitemSn(Integer.parseInt(srvyQitemSn));
                        // 페이지네이션 설정 (전체 목록을 가져오기 위해 큰 값으로 설정)
                        artclSearchVO.setRecordCountPerPage(1000);
                        artclSearchVO.setFirstIndex(0);
                        List<SrvyQitemArtclVO> artclList = srvyQitemArtclService.selectSrvyQitemArtclList(artclSearchVO);
                        model.addAttribute("artclList", artclList);
                    } catch (Exception artclException) {
                        log.error("선택지 목록 조회 중 오류 발생", artclException);
                        model.addAttribute("artclList", new java.util.ArrayList<>());
                    }
                } else {
                    log.error("해당 문항을 찾을 수 없습니다. srvyQitemSn: {}", srvyQitemSn);
                    model.addAttribute("mode", "create");
                    model.addAttribute("errorMessage", "해당 문항을 찾을 수 없어 등록 모드로 전환됩니다.");
                }
            }

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


}