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

import go.kr.project.system.group.model.GroupSearchVO;
import go.kr.project.system.group.model.GroupVO;
import go.kr.project.system.user.model.SystemUserSearchVO;
import go.kr.project.system.user.model.SystemUserVO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

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

    /**
     * 사용자 계정 중복을 조회합니다.
     *
     * @param userAcnt 사용자 계정
     * @return 중복 숫자
     */
    int selectUserAcntDuplicateCheck(String userAcnt);

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

    /**
     * 사용자 목록을 조회합니다.
     * 
     * @param paramVO 검색 조건을 담은 VO 객체
     * @return 사용자 목록
     */
    List<SystemUserVO> selectUserList(SystemUserSearchVO paramVO);

    /**
     * 사용자 목록의 총 개수를 조회합니다.
     * 
     * @param paramVO 검색 조건을 담은 VO 객체
     * @return 사용자 목록의 총 개수
     */
    int selectUserListTotalCount(SystemUserSearchVO paramVO);

    /**
     * 사용자 ID를 생성합니다.
     * 
     * @return USER00000001 형태의 사용자 ID
     */
    String generateUserId();

    /**
     * 사용자 정보를 등록합니다.
     * 
     * @param vo 등록할 사용자 정보를 담은 VO 객체
     * @return 등록된 행의 수
     */
    int insertUser(SystemUserVO vo);

    /**
     * 사용자 정보를 수정합니다.
     * 
     * @param vo 수정할 사용자 정보를 담은 VO 객체
     * @return 수정된 행의 수
     */
    int updateUser(SystemUserVO vo);

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

    /**
     * 비밀번호 변경
     * @param user 사용자 정보 (userId, passwd 필요)
     * @return 수정된 행 수
     */
    int updatePassword(SystemUserVO user);

    /**
     * 비밀번호 확인
     * @param user 사용자 정보 (userId, passwd 필요)
     * @return 일치하는 사용자 수 (1: 일치, 0: 불일치)
     */
    int checkPassword(SystemUserVO user);

    /**
     * 사용자 잠금 해제
     * @param userId 사용자 ID
     * @return 수정된 행 수
     */
    int unlockUser(String userId);
}
