package go.kr.project.system.auth.service;

import go.kr.project.system.auth.model.GroupRoleVO;
import go.kr.project.system.auth.model.RoleMenuVO;
import go.kr.project.system.group.model.GroupSearchVO;
import go.kr.project.system.group.model.GroupVO;
import go.kr.project.system.menu.model.MenuSearchVO;
import go.kr.project.system.menu.model.MenuVO;
import go.kr.project.system.role.model.RoleSearchVO;
import go.kr.project.system.role.model.RoleVO;

import java.util.List;

/**
 * packageName    : go.kr.project.system.auth.service
 * fileName       : AuthService
 * author         : 시스템 관리자
 * date           : 2023-06-15
 * description    : 권한 부여 관련 비즈니스 로직을 처리하는 서비스 인터페이스
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2023-06-15        시스템 관리자       최초 생성
 */
public interface AuthService {

    /**
     * 역할에 할당된 메뉴 목록을 조회합니다.
     * 
     * @param roleId 역할 ID
     * @return 역할에 할당된 메뉴 목록
     */
    List<RoleMenuVO> selectRoleMenuList(String roleId);

    /**
     * 역할에 할당되지 않은 메뉴 목록을 조회합니다.
     * 
     * @param roleId 역할 ID
     * @return 역할에 할당되지 않은 메뉴 목록
     */
    List<MenuVO> selectUnassignedMenuList(String roleId);

    /**
     * 역할에 메뉴를 할당합니다.
     * 
     * @param roleMenuVO 역할-메뉴 매핑 정보
     * @return 할당된 행의 수
     */
    int insertRoleMenu(RoleMenuVO roleMenuVO);

    /**
     * 역할에서 메뉴를 제거합니다.
     * 
     * @param roleId 역할 ID
     * @param menuId 메뉴 ID
     * @return 제거된 행의 수
     */
    int deleteRoleMenu(String roleId, String menuId);

    /**
     * 역할에 여러 메뉴를 할당합니다.
     * 
     * @param roleId 역할 ID
     * @param menuIds 메뉴 ID 목록
     * @param rgtr 등록자
     * @return 할당된 행의 수
     */
    int assignMenusToRole(String roleId, List<String> menuIds, String rgtr);

    /**
     * 그룹에 할당된 역할 목록을 조회합니다.
     * 
     * @param groupId 그룹 ID
     * @return 그룹에 할당된 역할 목록
     */
    List<GroupRoleVO> selectGroupRoleList(String groupId);

    /**
     * 그룹에 할당되지 않은 역할 목록을 조회합니다.
     * 
     * @param groupId 그룹 ID
     * @return 그룹에 할당되지 않은 역할 목록
     */
    List<RoleVO> selectUnassignedRoleList(String groupId);

    /**
     * 그룹에 역할을 할당합니다.
     * 
     * @param groupRoleVO 그룹-역할 매핑 정보
     * @return 할당된 행의 수
     */
    int insertGroupRole(GroupRoleVO groupRoleVO);

    /**
     * 그룹에서 역할을 제거합니다.
     * 
     * @param groupId 그룹 ID
     * @param roleId 역할 ID
     * @return 제거된 행의 수
     */
    int deleteGroupRole(String groupId, String roleId);

    /**
     * 그룹에 여러 역할을 할당합니다.
     * 
     * @param groupId 그룹 ID
     * @param roleIds 역할 ID 목록
     * @param rgtr 등록자
     * @return 할당된 행의 수
     */
    int assignRolesToGroup(String groupId, List<String> roleIds, String rgtr);

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

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

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