package incheon.ags.ias.sysMenuAuthrt.service;

import incheon.ags.ias.sysMenuAuthrt.vo.SysMenuAuthrtSearchVO;

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

public interface SysMenuAuthrtService {
    
    // 메뉴 권한 목록 조회
    List<Map<String, Object>> selectSysMenuAuthrtList(SysMenuAuthrtSearchVO sysMenuAuthrtSearchVO) throws Exception;
    
    // 메뉴 권한 목록 카운트 조회
    int selectSysMenuAuthrtListCnt(SysMenuAuthrtSearchVO sysMenuAuthrtSearchVO) throws Exception;
    
    // 권한 목록 조회
    List<Map<String, Object>> selectAuthrtList() throws Exception;
    
    // 역할 목록 조회
    List<Map<String, Object>> selectRoleList() throws Exception;
    
    // 권한 설정 조회 (MENU 타입) - sysCd 필터링
    List<Map<String, Object>> selectAuthrtStngList(String sysCd) throws Exception;
    
    // 시스템 전역 권한 조회 (SYS 타입) - sysCd 필터링
    List<Map<String, Object>> selectSystemAuthrtList(String sysCd) throws Exception;
    
    // 특정 역할 정보 조회 (ROLE_CD + SYS_CD 복합키)
    Map<String, Object> selectRoleInfo(Map<String, Object> params) throws Exception;
    
    // SYS_CD로 메뉴 목록 조회 (계층 구조)
    List<Map<String, Object>> selectMenuListBySysCd(String sysCd) throws Exception;

    // 시스템 목록 조회
    List<Map<String, Object>> selectSystemList() throws Exception;

    // 특정 역할의 메뉴-권한 매핑 전체 조회
    List<Map<String, Object>> selectSysMenuAuthrtByRoleCd(Map<String, Object> params) throws Exception;

    // 특정 역할의 시스템-권한 매핑 전체 조회
    List<Map<String, Object>> selectSysRoleAuthrtByRoleCd(Map<String, Object> params) throws Exception;

    /**
     * 권한 설정 전체 재설정 (삭제 후 재삽입)
     * @param typeCd 권한 설정 타입 코드 (MENU/SYS)
     * @param trgtCd 권한 설정 타겟 코드 (메뉴코드/시스템코드)
     * @param stngList 권한 설정 목록 (빈 리스트일 경우 삭제만 수행)
     * @param userId 사용자 ID
     * @return 등록된 권한 설정 건수
     */
    int updateAuthrtStngByTarget(String typeCd, String trgtCd, List<Map<String, Object>> stngList, String userId, String sysCd) throws Exception;

    /**
     * 역할-권한 매핑 전체 재설정 (삭제 후 재삽입)
     * @param roleCd 역할 코드
     * @param sysCd 시스템 코드
     * @param menuAuthrtList 메뉴 권한 목록
     * @param sysAuthrtList 시스템 권한 목록
     * @param userId 사용자 ID
     */
    void updateRoleAuthrtMapping(String roleCd, String sysCd, List<Map<String, Object>> menuAuthrtList,
                                 List<Map<String, Object>> sysAuthrtList, String userId) throws Exception;
}
