package go.kr.project.system.menu.mapper;

import go.kr.project.system.menu.model.MenuSearchVO;
import go.kr.project.system.menu.model.MenuVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

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

/**
 * @author 시스템 관리자
 * @description 메뉴 정보 관리를 위한 매퍼 인터페이스
 * @createDate 2023-06-01
 * @Entity go.kr.project.system.menu.model.MenuVO
 */
@Mapper
public interface MenuMapper {

    /**
     * 메뉴 목록을 트리 구조로 조회합니다.
     * 
     * @param paramVO 검색 조건을 담은 VO 객체
     * @return 트리 구조의 메뉴 목록
     */
    List<MenuVO> selectMenuTreeList(MenuSearchVO paramVO);

    /**
     * 메뉴 정보를 등록합니다.
     * 
     * @param vo 등록할 메뉴 정보를 담은 VO 객체
     * @return 등록된 행의 수
     */
    int insertMenu(MenuVO vo);

    /**
     * 메뉴 정보를 수정합니다.
     * 
     * @param vo 수정할 메뉴 정보를 담은 VO 객체
     * @return 수정된 행의 수
     */
    int updateMenu(MenuVO vo);

    /**
     * 메뉴 정보를 삭제합니다.
     * 
     * @param menuId 삭제할 메뉴 ID
     * @return 삭제된 행의 수
     */
    int deleteMenu(String menuId);

    /**
     * 하위 메뉴 존재 여부를 확인합니다.
     * 
     * @param menuId 확인할 메뉴 ID
     * @return 하위 메뉴 개수
     */
    int countChildMenus(String menuId);

    /**
     * 메뉴가 사용 중인지 확인합니다.
     * 
     * @param menuId 확인할 메뉴 ID
     * @return 사용 중인 경우 true, 그렇지 않은 경우 false
     */
    boolean checkMenuInUse(String menuId);

    /**
     * 메뉴를 사용 중인 역할, 그룹, 사용자 정보를 조회합니다.
     * 
     * @param menuId 확인할 메뉴 ID
     * @return 메뉴를 사용 중인 역할, 그룹, 사용자 정보 목록
     */
    List<Map<String, Object>> getMenuUsageInfo(String menuId);


    /**
     * 메뉴 ID를 자동 생성합니다.
     * 
     * @param menuLevel 메뉴 레벨
     * @param upperMenuId 상위 메뉴 ID
     * @return 생성된 메뉴 ID
     */
    String generateMenuIdByQuery(@Param("menuLevel") int menuLevel, @Param("upperMenuId") String upperMenuId);
}
