package org.xyzh.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.xyzh.common.core.page.PageParam;
import org.xyzh.common.dto.user.TbSysUser;
import org.xyzh.common.dto.user.TbSysUserInfo;
import org.xyzh.common.vo.UserVO;

import java.util.List;

/**
 * @description UserMapper.java文件描述 用户数据访问层
 * @filename UserMapper.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-09-28
 */
@Mapper
public interface UserMapper extends BaseMapper<TbSysUser> {

    /**
     * @description 插入用户
     * @param user 用户信息
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-06
     */
    int insertUser(@Param("user") TbSysUser user);

    /**
     * @description 更新用户
     * @param user 用户信息
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-06
     */
    int updateUser(@Param("user") TbSysUser user);

    /**
     * @description 删除用户
     * @param userID 用户ID
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-06
     */
    int deleteUser(@Param("userID") String userID);

    /**
     * @description 根据用户名查询用户
     * @param username 用户名
     * @return TbSysUser 用户信息
     * @author yslg
     * @since 2025-09-28
     */
    TbSysUser selectByUsername(@Param("username") String username);

    /**
     * @description 根据邮箱查询用户
     * @param email 邮箱
     * @return TbSysUser 用户信息
     * @author yslg
     * @since 2025-09-28
     */
    TbSysUser selectByEmail(@Param("email") String email);

    /**
     * @description 根据手机号查询用户
     * @param phone 手机号
     * @return TbSysUser 用户信息
     * @author yslg
     * @since 2025-09-28
     */
    TbSysUser selectByPhone(@Param("phone") String phone);

    /**
     * @description 根据过滤条件查询用户
     * @param filter 过滤条件
     * @return TbSysUser 用户信息
     * @author yslg
     * @since 2025-09-28
     */
    List<TbSysUser> selectByFilter(@Param("filter") TbSysUser filter);

    /**
     * @description 查询用户列表（分页）
     * @param username 用户名（模糊查询）
     * @param email 邮箱（模糊查询）
     * @param status 用户状态
     * @return List<TbSysUser> 用户列表
     * @author yslg
     * @since 2025-09-28
     */
    List<TbSysUser> selectUserList(@Param("username") String username, 
                                   @Param("email") String email, 
                                   @Param("status") String status);

    /**
     * @description 查询用户列表（分页）
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @return List<TbSysUser> 用户列表
     * @author yslg
     * @since 2025-09-28
     */
    List<TbSysUser> selectUserPage(@Param("filter") TbSysUser filter, @Param("pageParam") PageParam pageParam);

    /**
     * @description 批量删除用户（逻辑删除）
     * @param userIds 用户ID列表
     * @param updater 更新人
     * @return int 影响行数
     * @author yslg
     * @since 2025-09-28
     */
    int batchDeleteByIds(@Param("userIds") List<String> userIds, @Param("updater") String updater);

    // ----------------用户信息相关--------------------------------

    /**
     * @description 根据用户ID查询用户信息
     * @param userId 用户ID
     * @return TbSysUserInfo 用户信息
     * @author yslg
     * @since 2025-10-06
     */
    TbSysUserInfo selectUserInfoById(@Param("userId") String userId);

    /**
     * @description 更新用户信息
     * @param userInfo 用户信息
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-06
     */
    int updateUserInfo(@Param("userInfo") TbSysUserInfo userInfo);

    /**
     * @description 获取用户完整部门路径
     * @param userId 用户ID
     * @return String 部门路径（如：公司总部/技术部/前端组）
     * @author yslg
     * @since 2025-10-18
     */
    String getUserDeptPath(@Param("userId") String userId);

    /**
     * @description 获取用户信息总览
     * @param userId 用户ID
     * @return UserVO 用户信息总览
     * @author yslg
     * @since 2025-10-18
     */
    UserVO selectUserInfoTotal(@Param("userId") String userId);
}
