package com.takensoft.cms.codeManage.dao;

import com.takensoft.cms.codeManage.vo.CodeManageVO;
import com.takensoft.cms.dept.vo.DeptVO;
import com.takensoft.common.HierachyVO;
import org.egovframe.rte.psl.dataaccess.mapper.Mapper;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author  : takensoft
 * @since   :2024.04.09
 * @modification
 *     since    |    author    | description
 *  2024.04.09  |   takensoft  | 최초 등록
 *  2024.04.15  |   takensoft  | update 추가
 *  2024.04.23  |   takensoft  | deleteCd 추가
 *  2024.04.24  |   takensoft  | findByTopNode, findChildNode 추가
 *  2024.04.26  |   takensoft  | updateUpCd 추가
 *  2024.05.10  |    박정하     | codeUpdateByHierachy 추가
 *  2025.03.13  |    방선주    | 코드 리펙토링
 *
 * 공통코드 정보 관련 DAO
 */
@Mapper("codeManageDAO")
public interface CodeManageDAO {
    /**
     * @param codeManageVO - 공통코드 객체
     * @return boolean - 코드 중복 결과
     *
     * 공통 코드 중복 검사
     */
    boolean findByCheckCd(CodeManageVO codeManageVO);

    /**
     * @param codeManageVO - 공통코드 객체
     * @return int - 공통 코드 등록 결과
     *
     * 코드 등록
     */
    int save(CodeManageVO codeManageVO);

    /**
     * @param codeManageVO - 공통코드 객체
     * @return int - 공통 코드 수정 결과
     *
     * 코드 수정
     */
    int update(CodeManageVO codeManageVO);

    /**
     * @param codeManageVO - 공통코드 객체
     * @return int - 상위 코드 수정에 따른 하위 코드 변경 결과
     *
     * 상위코드가 수정됨에 따라 하위코드의 상위코드값 변경
     */
    int updateUpCd(CodeManageVO codeManageVO);

    /**
     * @param upCd - 상위 코드 명
     * @return int - 상위 코드 깊이
     *
     * 상위코드가 수정됨에 따라 하위코드의 상위코드값 변경
     */
    int findByCdGrd(String upCd);

    /**
     * @param upCd - 상위 코드 명
     * @return int - 코드 순서
     *
     * 코드 순서 조회
     */
    int findByCdSn(String upCd);

    /**
     * @param
     * @return List<CodeManageVO> - 공통코드 목록
     *
     * 최상위 코드 조회
     */
    List<CodeManageVO> findTopCd();

    /**
     * @param childMap - 상위 코드, type(mng, user)
     * @return List<CodeManageVO> - 하위 코드 목록
     *
     * 하위 코드 조회
     */
    List<CodeManageVO> findChildCd(Map<String, Object> childMap);

//    /**
//     * @param cd - 상위 코드 명
//     * @return List<CodeManageVO> - 하위 코드 목록
//     *
//     * 하위 코드 조회[관리자용]
//     */
//    List<CodeManageVO> findChildCd(String cd);

//    /**
//     * @param cd - 상위 코드 명
//     * @return List<CodeManageVO> - 하위 코드 목록
//     *
//     * 하위 코드 조회[사용자용]
//     */
//    List<CodeManageVO> findChildCdUser(String cd);

    /**
     * @param cd - 코드 명
     * @return CodeManageVO - 상세 코드 정보
     *
     * 코드 상세 조회
     */
    CodeManageVO findByCd(String cd);

    /**
     * @param cd - 코드 명
     * @return int - 삭제 결과
     *
     * 코드 삭제
     */
    int deleteCd(String cd);

    /************************************** Hierachy 전용 **************************************/

    /**
     * @param
     * @return List<HierachyVO> - 공통 코드 목록
     *
     * 최상위 코드 조회
     */
    List<HierachyVO> findByTopNode();

    /**
     * @param id - 상위 코드 명
     * @return List<HierachyVO> - 공통 코드 목록
     *
     * 하위 코드 조회
     */
    List<HierachyVO> findChildNode(String id);
    /************************************** Hierachy 전용 **************************************/

    /**
     * @param codeManageVO - 공통코드 객체
     * @return int - 공통 코드 수정 결과
     *
     * 공통 코드 목록 정보 수정 (hierachyVO 사용)
     */
    int codeUpdateByHierachy(CodeManageVO codeManageVO);
}