package go.kr.project.login.mapper;

import go.kr.project.login.model.LoginUserVO;
import go.kr.project.login.model.UserSessionVO;
import go.kr.project.system.group.model.GroupVO;
import go.kr.project.system.menu.model.MenuVO;
import go.kr.project.system.role.model.RoleVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
* @author 박성영
* @description
* @createDate 2025-05-07 14:34:50
* @Entity go.kr.project.system.user.domain.TbUser
*/
@Mapper
public interface LoginMapper {

    /**
     * 사용자 정보를 조회합니다.
     * 
     * @param userId 사용자 ID
     * @return 사용자 정보
     */
    LoginUserVO selectUser(String userId);

    /**
     * 사용자 계정으로 사용자 정보를 조회합니다.
     * 
     * @param userAcnt 사용자 계정
     * @return 사용자 정보
     */
    LoginUserVO selectUserByAcnt(String userAcnt);

    /**
     * 비밀번호 잠금 정보를 업데이트합니다.
     * 
     * @param user 사용자 정보
     * @return 업데이트된 행의 수
     */
    int updatePasswordLock(LoginUserVO user);

    /**
     * 비밀번호 잠금 해제 정보를 업데이트합니다.
     * 
     * @param user 사용자 정보
     * @return 업데이트된 행의 수
     */
    int updatePasswordUnlock(LoginUserVO user);

    /**
     * 그룹 정보를 조회합니다.
     * 
     * @param userGroupId 그룹 ID
     * @return 그룹 정보
     */
    GroupVO selectGroup(String userGroupId);

    /**
     * 그룹 ID로 역할 목록을 조회합니다.
     * 
     * @param userGroupId 그룹 ID
     * @return 역할 목록
     */
    List<RoleVO> selectRolesByUserGroupId(String userGroupId);

    /**
     * 역할 ID 목록으로 메뉴 목록을 트리 구조로 조회합니다.
     * 
     * @param roleIds 역할 ID 목록
     * @return 트리 구조의 메뉴 목록
     */
    List<MenuVO> selectMenusByRoleIds(@Param("roleIds") List<String> roleIds, @Param("upperMenuId") String upperMenuId);

    /**
     * 사용자 세션 정보를 저장합니다.
     * 
     * @param userSession 사용자 세션 정보
     * @return 저장된 행의 수
     */
    int insertUserSession(UserSessionVO userSession);

    /**
     * 사용자 ID로 세션 정보를 조회합니다.
     * 
     * @param userId 사용자 ID
     * @return 사용자 세션 정보 목록
     */
    List<UserSessionVO> selectUserSessionByUserId(String userId);

    /**
     * 세션 ID로 세션 정보를 조회합니다.
     * 
     * @param sessionId 세션 ID
     * @return 사용자 세션 정보
     */
    UserSessionVO selectUserSessionBySessionId(String sessionId);

    /**
     * 사용자 ID로 세션 정보를 삭제합니다.
     * 
     * @param userId 사용자 ID
     * @return 삭제된 행의 수
     */
    int deleteUserSessionByUserId(String userId);

    /**
     * 세션 ID로 세션 정보를 삭제합니다.
     * 
     * @param sessionId 세션 ID
     * @return 삭제된 행의 수
     */
    int deleteUserSessionBySessionId(String sessionId);

    /**
     * 세션 정보를 업데이트합니다.
     * 
     * @param userSession 사용자 세션 정보
     * @return 업데이트된 행의 수
     */
    int updateUserSession(UserSessionVO userSession);
}
