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

import go.kr.project.system.code.model.CodeDetailVO;
import go.kr.project.system.code.model.CodeGroupVO;
import go.kr.project.system.code.model.CodeSearchVO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * packageName    : go.kr.project.system.code.mapper
 * fileName       : CodeMapper
 * author         : 개발자
 * date           : 2025-05-09
 * description    : 공통 코드 관련 데이터 접근을 담당하는 매퍼 인터페이스
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2025-05-09        개발자       최초 생성
 * 2025-05-13        개발자       CodeMaster를 CodeGroup으로 변경
 */
@Mapper
public interface CodeMapper {

    /**
     * 코드 그룹 목록을 조회합니다.
     * 
     * @param vo 검색 조건을 담은 VO 객체
     * @return 코드 그룹 목록
     */
    List<CodeGroupVO> selectCodeGroupList(CodeSearchVO vo);

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

    /**
     * 코드 상세 목록을 조회합니다.
     * 
     * @param vo 검색 조건을 담은 VO 객체
     * @return 코드 상세 목록
     */
    List<CodeDetailVO> selectCodeDetailList(CodeSearchVO vo);

    /**
     * 코드 상세 목록의 총 개수를 조회합니다.
     * 
     * @param vo 검색 조건을 담은 VO 객체
     * @return 코드 상세 목록의 총 개수
     */
    int selectCodeDetailListTotalCount(CodeSearchVO vo);

    /**
     * 코드 상세 정보를 등록합니다.
     * 
     * @param vo 등록할 코드 상세 정보를 담은 VO 객체
     * @return 등록된 행의 수
     */
    int insertCodeDetail(CodeDetailVO vo);

    /**
     * 코드 상세 정보를 수정합니다.
     * 
     * @param vo 수정할 코드 상세 정보를 담은 VO 객체
     * @return 수정된 행의 수
     */
    int updateCodeDetail(CodeDetailVO vo);

    /**
     * 특정 코드 상세 정보를 삭제합니다.
     * 
     * @param codeDetailVO 삭제할 코드 상세 정보를 담은 VO 객체
     * @return 삭제된 행의 수
     */
    int deleteCodeDetail(CodeDetailVO codeDetailVO);

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

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

    /**
     * 특정 코드 그룹 정보를 삭제합니다.
     * 
     * @param codeGroupVO 삭제할 코드 그룹 정보를 담은 VO 객체
     * @return 삭제된 행의 수
     */
    int deleteCodeGroup(CodeGroupVO codeGroupVO);

    /**
     * 코드 그룹 ID와 코드 ID로 상세 코드의 존재 여부를 확인합니다.
     * 
     * @param vo 확인할 코드 상세 정보를 담은 VO 객체
     * @return 일치하는 코드 상세 정보의 개수
     */
    int selectCodeDetailExistsCount(CodeDetailVO vo);
}
