package com.njcn.rdms.module.system.dal.mysql.user;

import com.njcn.rdms.framework.mybatis.core.mapper.BaseMapperX;
import com.njcn.rdms.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.njcn.rdms.module.system.controller.admin.user.vo.userManagementRelation.UserManagementRelationQueryReqVO;
import com.njcn.rdms.module.system.dal.dataobject.user.UserManagementRelationDO;
import org.apache.ibatis.annotations.Mapper;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 用户管理链路 Mapper 接口
 * 
 * 提供用户管理链路表的数据访问操作
 * 继承 BaseMapperX 获得基础的 CRUD 功能
 *
 * @author hongawen
 */
@Mapper
public interface UserManagementRelationMapper extends BaseMapperX<UserManagementRelationDO> {

    /**
     * 根据查询条件查询用户管理链路列表
     * 
     * 支持的查询条件：
     * - managerUserId：管理者用户ID，精确匹配
     * - subordinateUserId：被管理用户ID，精确匹配
     * 
     * 排序规则：按主键ID降序排列
     *
     * @param reqVO 查询条件VO
     * @return 用户管理链路DO列表
     */
    default List<UserManagementRelationDO> selectList(UserManagementRelationQueryReqVO reqVO) {
        LocalDateTime now = LocalDateTime.now();
        return selectList(new LambdaQueryWrapperX<UserManagementRelationDO>()
                .eqIfPresent(UserManagementRelationDO::getManagerUserId, reqVO.getManagerUserId())
                .eqIfPresent(UserManagementRelationDO::getSubordinateUserId, reqVO.getSubordinateUserId())
                .orderByDesc(UserManagementRelationDO::getId)
                // (from IS NULL OR from <= now)
                .and(w -> w.isNull(UserManagementRelationDO::getEffectiveFrom)
                        .or().le(UserManagementRelationDO::getEffectiveFrom, now))
                // (until IS NULL OR until >= now)
                .and(w -> w.isNull(UserManagementRelationDO::getEffectiveUntil)
                        .or().ge(UserManagementRelationDO::getEffectiveUntil, now))
        );
    }

    /**
     * 根据管理者用户ID查询其下属关系列表
     * 
     * 查询指定用户作为管理者时的所有管理链路记录
     * 用于获取某个用户的所有直接下属
     *
     * @param managerUserId 管理者用户ID
     * @return 用户管理链路DO列表
     */
    default List<UserManagementRelationDO> selectListByManagerUserId(Long managerUserId) {
        return selectList(UserManagementRelationDO::getManagerUserId, managerUserId);
    }

    /**
     * 根据被管理者用户ID查询其上级关系列表
     * 
     * 查询指定用户作为被管理者时的所有管理链路记录
     * 用于获取某个用户的所有直接上级
     *
     * @param subordinateUserId 被管理者用户ID
     * @return 用户管理链路DO列表
     */
    default List<UserManagementRelationDO> selectListBySubordinateUserId(Long subordinateUserId) {
        return selectList(UserManagementRelationDO::getSubordinateUserId, subordinateUserId);
    }

    /**
     * 根据被管理者用户ID查询当前生效的上级关系列表
     *
     * @param subordinateUserId 被管理者用户ID
     * @return 当前生效的用户管理链路DO列表
     */
    default List<UserManagementRelationDO> selectValidListBySubordinateUserId(Long subordinateUserId) {
        LocalDateTime now = LocalDateTime.now();
        return selectList(new LambdaQueryWrapperX<UserManagementRelationDO>()
                .eq(UserManagementRelationDO::getSubordinateUserId, subordinateUserId)
                // (from IS NULL OR from <= now)
                .and(w -> w.isNull(UserManagementRelationDO::getEffectiveFrom)
                        .or().le(UserManagementRelationDO::getEffectiveFrom, now))
                // (until IS NULL OR until >= now)
                .and(w -> w.isNull(UserManagementRelationDO::getEffectiveUntil)
                        .or().ge(UserManagementRelationDO::getEffectiveUntil, now))
                .orderByDesc(UserManagementRelationDO::getId));
    }

}
