package incheon.ags.ias.authrtAplyMng.web;

import incheon.ags.ias.authrtAplyMng.service.impl.AuthrtAplyMngServiceImpl;
import incheon.ags.ias.authrtAplyMng.vo.AuthrtAplyMngSearchVO;
import incheon.ags.ias.authrtAplyMng.vo.AuthrtAplyMngVO;
import incheon.com.security.annotation.RequireRole;
import incheon.com.security.util.SecurityUtil;
import incheon.com.security.vo.LoginVO;
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 java.util.List;
import java.util.Map;

@Controller
@RequiredArgsConstructor
@Slf4j
@RequireRole(system = "AGS", roles = {"ROLE_SUPER_ADMIN", "ROLE_AGS_ADMIN"}, description = "통합관리자 역할 접근 제어")
public class AuthrtAplyMngController {
    private final AuthrtAplyMngServiceImpl authrtAplyMngService;

    @GetMapping({"/ags/ias/authrtAplyMng/authrtAplyMngList.do", "/ags/ias/authrt/authrtAplyMng/list.do"})
    public String authrtAplyMngList(
            @RequestParam(defaultValue = "1") int page,
            @ModelAttribute AuthrtAplyMngSearchVO searchVO,
            ModelMap model) throws Exception {

        // 권한 필터링: 통합관리자는 전체, 업무관리자는 해당 시스템만, 그 외는 조회 불가
        LoginVO loginVO = SecurityUtil.getCurrentUser();
        boolean hasAdminAuthrt = true;
        if (loginVO != null && !loginVO.isSuperAdmin()) {
            List<String> adminSysCds = loginVO.getAdminSysCds();
            if (adminSysCds != null && !adminSysCds.isEmpty()) {
                // 업무관리자: 해당 시스템만 조회
                searchVO.setSysCdList(adminSysCds);
                log.info("업무관리자 필터링 적용 - 시스템 코드: {}", adminSysCds);
            } else {
                // 일반 사용자: 조회 권한 없음
                hasAdminAuthrt = false;
                log.info("일반 사용자 - 조회 권한 없음");
            }
        }

        // 페이징 설정
        PaginationInfo paginationInfo = new PaginationInfo();
        paginationInfo.setRecordCountPerPage(searchVO.getRecordCountPerPage());
        paginationInfo.setPageSize(searchVO.getPageSize());

        int totalCntResult = 0;
        List<Map<String, Object>> userRoleAplyList = List.of();

        if (hasAdminAuthrt) {
            // 권한이 있는 경우만 조회
            totalCntResult = authrtAplyMngService.selectUserRoleAplyTotalCnt(searchVO);

            // 페이지 번호 보정 (totalCount 기준)
            int maxPage = (int) Math.ceil((double) totalCntResult / searchVO.getRecordCountPerPage());
            if (maxPage > 0 && page > maxPage) {
                page = maxPage;
            }
            if (page < 1) page = 1;

            searchVO.setPageIndex(page);
            paginationInfo.setCurrentPageNo(page);
            searchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
            searchVO.setLastIndex(paginationInfo.getLastRecordIndex());

            userRoleAplyList = authrtAplyMngService.selectUserRoleAplyList(searchVO);
        } else {
            // 권한 없으면 빈 결과
            page = 1;
            paginationInfo.setCurrentPageNo(page);
        }

        paginationInfo.setTotalRecordCount(totalCntResult);

        model.addAttribute("totalCount", totalCntResult);
        model.addAttribute("userRoleAplyList", userRoleAplyList);
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("searchVO", searchVO);

        return "/ags/ias/authrtAplyMng/authrtAplyMngList";
    }

    @GetMapping({"/ags/ias/authrtAplyMng/authrtAplyMngDetail.do", "/ags/ias/authrt/authrtAplyMng/detail.do"})
    public String authrtAplyMngForm(ModelMap model,
            @RequestParam(value = "aplySn") Long aplySn) throws Exception {


        AuthrtAplyMngVO vo = new AuthrtAplyMngVO();

        AuthrtAplyMngVO authrtAplyMngVO = new AuthrtAplyMngVO();
        authrtAplyMngVO.setAplySn(aplySn);

        AuthrtAplyMngVO userRoleAplyDetail = authrtAplyMngService.selectUserRoleAplyDetail(authrtAplyMngVO);
        model.addAttribute("userRoleAplyDetail", userRoleAplyDetail);

        return "/ags/ias/authrtAplyMng/authrtAplyMngDetail";
    }
}
