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

import go.kr.project.system.role.model.RoleSearchVO;
import go.kr.project.system.role.model.RoleVO;
import org.apache.ibatis.annotations.Mapper;

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

/**
 * @author 시스템 관리자
 * @description 역할 정보 관리를 위한 매퍼 인터페이스
 * @createDate 2023-06-01
 * @Entity go.kr.project.system.role.model.RoleVO
 */
@Mapper
public interface RoleMapper {

    /**
     * 역할 정보를 조회합니다.
     * 
     * @param selectRoleId 역할 ID
     * @return 역할 정보
     */
    RoleVO selectRole(String selectRoleId);

    /**
     * 역할 목록을 조회합니다.
     * 
     * @param paramVO 검색 조건을 담은 VO 객체
     * @return 역할 목록
     */
    List<RoleVO> selectRoleList(RoleSearchVO paramVO);

    /**
     * 역할 목록의 총 개수를 조회합니다.
     * 
     * @param paramVO 검색 조건을 담은 VO 객체
     * @return 역할 목록의 총 개수
     */
    int selectRoleListTotalCount(RoleSearchVO paramVO);

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

    /**
     * 역할 정보를 수정합니다.
     * 
     * @param vo 수정할 역할 정보를 담은 VO 객체
     * @return 수정된 행의 수
     */
    int updateRole(RoleVO vo);

    /**
     * 역할 정보를 삭제합니다.
     * 
     * @param roleId 삭제할 역할 ID
     * @return 삭제된 행의 수
     */
    int deleteRole(String roleId);

    /**
     * 역할에 연결된 역할-메뉴 매핑 정보를 삭제합니다.
     * 
     * @param roleId 삭제할 역할 ID
     * @return 삭제된 행의 수
     */
    int deleteRoleMenus(String roleId);

    /**
     * 역할에 연결된 그룹-역할 매핑 정보를 삭제합니다.
     * 
     * @param roleId 삭제할 역할 ID
     * @return 삭제된 행의 수
     */
    int deleteGroupRoles(String roleId);

    /**
     * 역할이 사용 중인지 확인합니다.
     * 
     * @param roleId 확인할 역할 ID
     * @return 사용 중인 경우 true, 그렇지 않은 경우 false
     */
    boolean checkRoleInUse(String roleId);

    /**
     * 역할 ID가 이미 존재하는지 확인합니다.
     * 
     * @param roleId 확인할 역할 ID
     * @return 존재하는 경우 true, 그렇지 않은 경우 false
     */
    boolean checkRoleIdDuplicate(String roleId);

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

}
