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.MySubordinateTreeRespVO;
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.AdminUserDO;
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;
import java.util.Set;

/**
 * 用户管理链路 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);

    /**
     * 获得某用户当前生效的直属上级
     *
     * @param userId 用户ID
     * @return 直属上级用户，不存在则返回 null
     */
    AdminUserDO getDirectManager(Long userId);

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

    /**
     * 获取当前用户为根节点的下属树。
     *
     * @param rootUserId 根用户 ID；为空时默认当前登录用户
     * @return 下属树
     */
    MySubordinateTreeRespVO getMySubordinateTree(Long rootUserId);

    /**
     * 获取还未绑定直属上级的候选下级用户列表
     *
     * @return 候选下级用户列表
     */
    List<AdminUserDO> getCandidateSubordinateUsers();

    /**
     * 获取管理者全部直接/间接下属 ID（不含本人）。
     *
     * @param managerUserId 管理者用户 ID
     * @return 全部下属用户 ID
     */
    Set<Long> getAllSubordinateUserIds(Long managerUserId);

    /**
     * 获得用户管理链路 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);
    }

    /**
     * 通过某个用户的id，判断管理链路表中是否有该用户的记录
     * 判断原则：
     *   --管理者ID或被管理者ID有一个字段的值等于用户id，且该记录没有被逻辑删除
     *   --则认为管理链路表中还在使用该用户
     *
     * @param userId 用户id
     * @return true:有该用户的记录，false:没有该用户的记录
     */
    Boolean hasRelation(Long userId);
}
