package org.xyzh.api.system.user;

import java.util.Collection;
import java.util.List;

import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.dto.user.TbSysUser;
import org.xyzh.common.dto.user.TbSysUserDeptRole;
import org.xyzh.common.dto.user.TbSysUserInfo;
import org.xyzh.common.vo.UserDeptRoleVO;
import org.xyzh.common.vo.UserVO;
import org.xyzh.common.core.page.PageParam;

/**
 * @description    UserRemoteService.java文件描述   用户远程服务接口
 * @filename    UserRemoteService.java
 * @author    yslg
 * @copyright xyzh
 * @since 2025-09-26
 */
public interface UserService {


    /**
     * @description    注册用户
     * @param    user 用户对象
     * @return    ResultDomain<TbSysUser> 注册结果
     * @author    yslg
     * @since 2025-10-07
     */
    ResultDomain<TbSysUser> registerUser(TbSysUser user);

    /**
     * @description    检查用户是否已存在  用户邮箱、手机号、微信号之一与数据库中的用户信息匹配
     * @param    user 用户对象
     * @return    ResultDomain<Boolean> 是否存在
     * @author    yslg
     * @since 2025-10-07
     */
    ResultDomain<Boolean> checkUserExists(TbSysUser user);

    /**
     * @description    获取所有用户
     * @return    ResultDomain<TbSysUser> 用户列表
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysUser> getAllUsers();

    /**
     * @description    根据用户ID查询用户
     * @param    userId 用户ID
     * @return    ResultDomain<TbSysUser> 用户信息
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysUser> getUserById(String userId);

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

    /**
     * @description    根据过滤条件查询用户（支持多种查询条件组合）
     * @param    filter 过滤条件（支持userID、username、email、phone等字段）
     * @return    ResultDomain<TbSysUser> 用户信息
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysUser> getUserByFilter(TbSysUser filter);

    /**
     * @description    获取用户列表分页
     * @param    filter 过滤条件
     * @param    pageParam 分页参数
     * @return    ResultDomain<TbSysUser> 用户列表
     * @author    yslg
     * @since 2025-10-09
     */
    ResultDomain<TbSysUser> getUserPage(TbSysUser filter, PageParam pageParam);

    /**
     * @description    创建用户
     * @param    user 用户对象
     * @return    ResultDomain<TbSysUser> 创建结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysUser> createUser(TbSysUser user);

    /**
     * @description    更新用户
     * @param    user 用户对象
     * @return    ResultDomain<TbSysUser> 更新结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysUser> updateUser(TbSysUser user);

    /**
     * @description    删除用户（逻辑删除）
     * @param    userId 用户ID
     * @return    ResultDomain<TbSysUser> 删除结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysUser> deleteUser(String userId);

    /**
     * @description    检查用户名是否存在
     * @param    username 用户名
     * @param    excludeId 排除的用户ID（用于更新时排除自身）
     * @return    ResultDomain<Boolean> 是否存在
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<Boolean> checkUsernameExists(String username, String excludeId);

    /**
     * @description    检查邮箱是否存在
     * @param    email 邮箱
     * @param    excludeId 排除的用户ID（用于更新时排除自身）
     * @return    ResultDomain<Boolean> 是否存在
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<Boolean> checkEmailExists(String email, String excludeId);

    /**
     * @description    搜索用户
     * @param    username 用户名（模糊查询）
     * @param    email 邮箱（模糊查询）
     * @param    status 状态
     * @return    ResultDomain<TbSysUser> 用户列表
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysUser> searchUsers(String username, String email, String status);

    /**
     * @description    修改用户状态
     * @param    userId 用户ID
     * @param    status 新状态
     * @return    ResultDomain<TbSysUser> 修改结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysUser> changeUserStatus(String userId, Integer status);

    /**
     * @description    重置用户密码
     * @param    userId 用户ID
     * @param    newPassword 新密码
     * @return    ResultDomain<TbSysUser> 重置结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysUser> resetPassword(String userId, String newPassword);

    /**
     * @description    绑定用户部门角色
     * @param    filter
     * @return    ResultDomain<UserDeptRoleVO> 绑定结果
     * @author    yslg
     * @since 2025-10-09
     */
    ResultDomain<TbSysUserDeptRole> getBindUserDeptRoleList(TbSysUserDeptRole filter);
 

    /**
     * @description    绑定用户部门角色
     * @param    filter
     * @return    ResultDomain<UserDeptRoleVO> 绑定结果
     * @author    yslg
     * @since 2025-10-09
     */
    ResultDomain<UserDeptRoleVO> bindUserDeptRole(UserDeptRoleVO userDeptRoleVO);

    /**
     * @description    解绑用户部门角色
     * @param    filter
     * @return    ResultDomain<UserDeptRoleVO> 解绑结果
     * @author    yslg
     * @since 2025-10-09
     */
    ResultDomain<UserDeptRoleVO> unbindUserDeptRole(UserDeptRoleVO userDeptRoleVO);


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

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

    /**
     * @description    更新用户信息
     * @param    userInfo 用户信息
     * @return    ResultDomain<TbSysUserInfo> 更新结果
     * @author    yslg
     * @since 2025-10-06
     */
    ResultDomain<TbSysUserInfo> updateUserInfo(TbSysUserInfo userInfo);

    /**
     * @description    获取用户信息总览
     * @param    userId 用户ID
     * @return    ResultDomain<TbSysUserInfo> 用户信息总览
     * @author    yslg
     * @since 2025-10-18
     */
    ResultDomain<UserVO> getUserInfoTotal(String userId);
}
