package com.takensoft.cms.dept.service;

import com.takensoft.cms.dept.vo.DeptAuthrtVO;
import com.takensoft.cms.dept.vo.DeptMbrVO;
import com.takensoft.cms.dept.vo.DeptVO;
import com.takensoft.common.HierachyVO;

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.05.10  |    박정하     | updateList, updateChildNode 추가
 *  2025.03.14  |    방선주     | 코드 리펙토링
 *
 * 부서 정보 관련 인터페이스
 */
public interface DeptService {

    /**
     * @param deptVO - 부서 정보
     * @return int - 등록 성공 여부
     *
     * 부서 등록
     */
    HashMap<String, Object> deptSave(DeptVO deptVO);

    /**
     * @param deptMbrVO - 부서 사용자 정보
     * @return int - 등록 성공 여부
     *
     * 부서 사용자 등록
     */
    int deptMbrSave(DeptMbrVO deptMbrVO);

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

    /**
     * @param
     * @return List<HierachyVO> - 최상위 부서 목록
     *
     * 최상위 부서 조회
     */
    List<HierachyVO> findByTopNode();

    /**
     * @param id - 상위 부서 ID
     * @return List<HierachyVO> - 하위 부서 목록
     *
     * 하위 부서 조회
     */
    List<HierachyVO> findChildNode(String id);
    /************************************** Hierachy 전용 **************************************/

    /**
     * @param params - 부서 정보
     * @return Map<String, Object> - 부서 정보
     *
     * 부서 정보 조회
     */
    Map<String, Object> findByDept(Map<String, String> params);

    /**
     * @param deptVO - 부서 정보
     * @return int - 수정 성공 여부
     *
     * 부서 정보 수정
     */
    int deptUpdate(DeptVO deptVO);

    /**
     * @param deptVO - 부서 정보
     * @return int - 삭제 성공 여부
     *
     * 부서 정보 삭제
     */
    int deptDelete(DeptVO deptVO);

    /**
     * @param deptMbrList - 부서 사용자 정보
     * @return int - 삭제 성공 여부
     *
     * 부서 사용자 삭제
     */
    int deptMbrDelete(List<DeptMbrVO> deptMbrList);

    /**
     * @param params - 부서 사용자 정보
     * @return Map<String, Object> - 부서에 등록되지 않는 사용자 정보
     *
     * 부서에 등록되지 않는 사용자 조회
     */
    Map<String, Object> findByMbr(Map<String, String> params);

    /**
     * @param deptList - 부서 목록
     * @return int - 수정 성공 여부
     *
     * 부서 목록 수정
     */
    int updateList(List<HierachyVO> deptList);

    /**
     * @param childList - 하위 부서 목록
     * @param upDeptVO - 상위 부서 정보
     * @return int - 수정 성공 여부
     *
     * 하위 부서 수정
     */
    int updateChildNode(List<HierachyVO> childList, DeptVO upDeptVO);

    /**
     * @param authrtCd - 권한 코드
     * @return List<DeptAuthrtVO> - 부서 권한 정보 목록
     *
     * 부서 권한 목록 조회 (권한 코드로 조회)
     */
    List<DeptAuthrtVO> findDeptAuthrtByAuthrtCd(String authrtCd);
}