package com.njcn.rdms.module.system.service.user;

import cn.hutool.core.collection.CollUtil;
import com.njcn.rdms.framework.common.util.collection.CollectionUtils;
import com.njcn.rdms.module.system.controller.admin.user.vo.userManagementRelation.UserManagementRelationQueryReqVO;
import com.njcn.rdms.module.system.controller.admin.user.vo.userManagementRelation.UserManagementRelationSaveReqVO;
import com.njcn.rdms.module.system.controller.admin.user.vo.userManagementRelation.UserManagementRelationTreeRespVO;
import com.njcn.rdms.module.system.dal.dataobject.user.UserManagementRelationDO;

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

/**
 * 用户带人关系 Service 接口
 *
 * @author dklive
 */
public interface UserManagementRelationService {

    /**
     * 创建用户带人关系
     *
     * @param createReqVO 关系信息
     * @return 关系编号
     */
    Long createRelation(UserManagementRelationSaveReqVO createReqVO);

    /**
     * 更新用户带人关系
     *
     * @param updateReqVO 关系信息
     */
    void updateRelation(UserManagementRelationSaveReqVO updateReqVO);

    /**
     * 删除用户带人关系
     *
     * @param id 关系编号
     */
    void deleteRelation(Long id);

    /**
     * 批量删除用户带人关系
     *
     * @param ids 关系编号数组
     */
    void deleteRelationList(List<Long> ids);

    /**
     * 获得用户带人关系
     *
     * @param id 关系编号
     * @return 用户带人关系
     */
    UserManagementRelationDO getRelation(Long id);

    /**
     * 获得用户带人关系列表
     *
     * @param ids 关系编号数组
     * @return 用户带人关系列表
     */
    List<UserManagementRelationDO> getRelationList(Collection<Long> ids);

    /**
     * 获得用户带人关系列表
     *
     * @param reqVO 查询条件
     * @return 用户带人关系列表
     */
    List<UserManagementRelationTreeRespVO> getRelationQuery(UserManagementRelationQueryReqVO reqVO);

    /**
     * 根据管理者用户ID获得带人关系列表
     *
     * @param managerUserId 管理者用户ID
     * @return 带人关系列表
     */
    List<UserManagementRelationDO> getRelationListByManagerUserId(Long managerUserId);

    /**
     * 根据被管理者用户ID获得带人关系列表
     *
     * @param subordinateUserId 被管理者用户ID
     * @return 带人关系列表
     */
    List<UserManagementRelationDO> getRelationListBySubordinateUserId(Long subordinateUserId);

    /**
     * 获得用户带人关系树形结构
     * 
     * 构建用户上下级关系的树形结构，用于前端树形控件展示
     * - 最高领导：没有上级，作为树的根节点
     * - 基层员工：没有下级，children为空列表
     *
     * @return 用户带人关系树形列表
     */
    List<UserManagementRelationTreeRespVO> getRelationTree();

    /**
     * 获得用户带人关系 Map
     *
     * @param ids 关系编号数组
     * @return 用户带人关系 Map
     */
    default Map<Long, UserManagementRelationDO> getRelationMap(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return new HashMap<>();
        }
        return CollectionUtils.convertMap(getRelationList(ids), UserManagementRelationDO::getId);
    }

}
