package incheon.ags.ias.menu.web;

import incheon.ags.ias.menu.service.MenuService;
import incheon.ags.ias.menu.vo.MenuSearchVO;
import incheon.ags.ias.menu.vo.MenuVO;
import incheon.ags.ias.sys.service.SysService;
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.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

@Controller
@RequiredArgsConstructor
@Slf4j
@RequireRole(system = "AGS", roles = "ROLE_SUPER_ADMIN", description = "통합관리자 역할 접근 제어")
public class MenuController {
    private final MenuService menuService;
    private final SysService sysService;

    @GetMapping("/ags/ias/menu/menuList.do")
    public String menuList(
            @RequestParam(defaultValue = "1") int page,
            @ModelAttribute MenuSearchVO vo,
            ModelMap model,
            HttpServletRequest request) throws Exception {

        // sysCd가 없으면 첫 번째 시스템으로 리다이렉트
        if (vo.getSysCd() == null || vo.getSysCd().isEmpty()) {
            List<Map<String, Object>> sysList = sysService.selectAllSysList();
            if (!sysList.isEmpty()) {
                String firstSysCd = (String) sysList.get(0).get("sysCd");
                log.info("sysCd가 없어서 첫 번째 시스템으로 리다이렉트: {}", firstSysCd);

                StringBuilder redirectUrl = new StringBuilder("redirect:/ags/ias/menu/menuList.do?sysCd=")
                        .append(firstSysCd)
                        .append("&page=").append(page);

                if (vo.getMenuNm() != null && !vo.getMenuNm().isEmpty()) {
                    redirectUrl.append("&menuNm=").append(vo.getMenuNm());
                }

                return redirectUrl.toString();
            }
        }

        // 1. 먼저 총 개수 조회 (검색 조건 적용)
        int totalCount = menuService.selectMenuListCnt(vo);

        // 2. 페이징 설정
        vo.setPageIndex(page);
        PaginationInfo paginationInfo = new PaginationInfo();
        paginationInfo.setCurrentPageNo(page);
        paginationInfo.setRecordCountPerPage(vo.getRecordCountPerPage());
        paginationInfo.setPageSize(vo.getPageSize());
        paginationInfo.setTotalRecordCount(totalCount);

        // 3. 페이징 파라미터 설정
        vo.setFirstIndex(paginationInfo.getFirstRecordIndex());
        vo.setLastIndex(paginationInfo.getLastRecordIndex());
        vo.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

        // 4. 메뉴 리스트 조회 (페이징 파라미터가 설정된 후)
        List<Map<String,Object>> menuList = menuService.selectMenuList(vo);

        model.addAttribute("menuList", menuList);
        model.addAttribute("totalCount", totalCount);
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("searchVO", vo);

        // 디버깅 로그
        log.info("페이지: {}, 시작: {}, 페이지당개수: {}, 총개수: {}, 조회개수: {}",
                page, vo.getFirstIndex(), vo.getRecordCountPerPage(),
                totalCount, menuList.size());

        return "ags/ias/menu/menuList";
    }

    @GetMapping("/ags/ias/menu/menuDetail.do")
    public String menuDetail(
            @RequestParam(defaultValue = "1") int page,
            ModelMap model,
            @RequestParam(required = false) String menuCd,
            @RequestParam(required = false) String sysCd) throws Exception {

        MenuVO vo = new MenuVO();
        vo.setMenuCd(menuCd);
        vo.setSysCd(sysCd);
        MenuVO result = menuService.selectMenuDetail(vo);

        List<Map<String, Object>> submenuList = menuService.selectSubmenuList(vo);

        model.addAttribute("menuDetail", result);
        model.addAttribute("submenuList", submenuList);

        return "ags/ias/menu/menuDetail";
    }

    @GetMapping("/ags/ias/menu/menuRegist.do")
//    @MenuCode("MENU010400")
    public String menuRegist(
            @RequestParam(value = "menuCd", required = false) String menuCd,
            @RequestParam(value = "sysCd", required = false) String sysCd,
            ModelMap model) throws Exception {

        if (menuCd != null) {
            model.addAttribute("mode", "update");
            MenuVO menuVO = new MenuVO();
            menuVO.setMenuCd(menuCd);
            menuVO.setSysCd(sysCd);
            MenuVO result = menuService.selectMenuDetail(menuVO);
            model.addAttribute("menuDetail", result);
            sysCd = result.getSysCd(); // 메뉴 상세에서 시스템코드 가져오기
        } else {
            model.addAttribute("mode", "insert");
        }

        // 시스템 코드가 있는 경우 해당 시스템의 메뉴만 조회
        if (sysCd != null && !sysCd.isEmpty()) {
            List<Map<String, Object>> menuList = menuService.selectMenuListFromSysCd(sysCd);
            model.addAttribute("menuList", menuList);
            model.addAttribute("sysCd", sysCd);
        }

        return "ags/ias/menu/menuRegist";
    }

    @GetMapping("/ags/ias/menu/menuModify.do")
    public String menuModify(
            @RequestParam(value = "menuCd", required = false) String menuCd,
            @RequestParam(value = "sysCd", required = false) String sysCd,
            ModelMap model) throws Exception {

        MenuVO menuVO = new MenuVO();
        menuVO.setMenuCd(menuCd);
        menuVO.setSysCd(sysCd);
        MenuVO result = menuService.selectMenuDetail(menuVO);
        model.addAttribute("menuDetail", result);

        // 해당 메뉴의 시스템 코드로 메뉴 리스트 조회
        String targetSysCd = result.getSysCd();
        List<Map<String, Object>> menuList = menuService.selectMenuListFromSysCd(targetSysCd);
        model.addAttribute("menuList", menuList);

        return "ags/ias/menu/menuModify";
    }
}