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

import go.kr.project.system.group.model.GroupSearchVO;
import go.kr.project.system.group.model.GroupVO;
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.group.model.GroupVO
 */
@Mapper
public interface GroupMapper {

    /**
     * 그룹 목록을 조회합니다.
     * 
     * @param paramVO 검색 조건을 담은 VO 객체
     * @return 그룹 목록
     */
    List<GroupVO> selectGroupList(GroupSearchVO paramVO);

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

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

    /**
     * 그룹 정보를 수정합니다.
     * 
     * @param vo 수정할 그룹 정보를 담은 VO 객체
     * @return 수정된 행의 수
     */
    int updateGroup(GroupVO vo);

    /**
     * 그룹 정보를 삭제합니다.
     * 
     * @param groupId 삭제할 그룹 ID
     * @return 삭제된 행의 수
     */
    int deleteGroup(String groupId);

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

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

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

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