package com.takensoft.cms.codeManage.service;

import com.takensoft.cms.codeManage.vo.CodeManageVO;
import com.takensoft.cms.dept.vo.DeptVO;
import com.takensoft.common.HierachyVO;

import java.util.List;

/**
 * @author takensoft
 * @since 2024.04.09
 * @modification
 *     since    |    author    | description
 *  2024.04.09  |  takensoft   | 최초 등록
 *  2024.04.15  |  takensoft   | cdUpdate, findByCdSystem 추가
 *  2024.04.19  |  takensoft   | findByChildCdCache 추가
 *  2024.04.23  |  takensoft   | cdDelete, findByTopNode, findChildNode 추가
 *  2024.05.10  |    박정하     | updateList, updateChildNode 추가
 *  2025.03.14  |    방선주     | 코드 리펙토링
 *
 * 공통코드 정보 관련 인터페이스
 */
public interface CodeManageService {
    /**
     * @param codeManageVO - 공통 코드 객체
     * @return boolean - 중복 여부 결과
     *
     * 코드 중복 검사
     */
    boolean findByCheckCd(CodeManageVO codeManageVO);

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

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

    /**
     * @param
     * @return List<CodeManageVO> - 공통 코드 목록
     *
     * 전체 코드 조회 [관리자용]
     */
    List<CodeManageVO> findTopCd();

    /**
     * @param cd - 상위 코드
     * @return List<CodeManageVO> - 공통 코드 목록
     *
     * 하위 코드 조회
     */
    List<CodeManageVO> findByChildCd(String cd);

    /**
     * @param cd - 상위 코드
     * @return CodeManageVO - 공통 코드 객체
     *
     * 코드 상세 조회
     */
    CodeManageVO findByCd(String cd);

    /**
     * @param cd - 상위 코드
     * @return CodeManageVO - 공통 코드 객체
     *
     * 특정 공통 목록 코드 조회(시스템 처리용)
     */
    CodeManageVO findByCdSystem(String cd);

    /**
     * @param cd - 상위 코드
     * @return List<CodeManageVO> - 공통 코드 목록
     *
     * 하위 코드 조회(cache)
     */
    List<CodeManageVO> findByChildCdCache(String cd);

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

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

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

    /**
     * @param id - 상위 코드
     * @return int - 삭제 결과
     *
     * 하위 코드 조회
     */
    List<HierachyVO> findChildNode(String id);
    /************************************** Hierachy 전용 **************************************/

    /**
     * @param deptList - 부서 리스트
     * @return int - 수정 결과
     *
     * 공통 코드 목록 수정
     */
    int updateList(List<HierachyVO> deptList);

    /**
     * @param childList - 부서 리스트
     * @param upCodeManageVO - 상위 코드 객체
     * @return int - 하위 코드 수정 결과
     *
     * 하위 코드 수정
     */
    int updateChildNode(List<HierachyVO> childList, CodeManageVO upCodeManageVO);
}