package org.xyzh.api.system.service;

import org.xyzh.api.system.vo.SysUserVO;
import org.xyzh.api.system.vo.UserDeptRoleVO;
import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.page.PageRequest;
import org.xyzh.common.dto.sys.TbSysUserDTO;
import org.xyzh.common.dto.sys.TbSysUserInfoDTO;
import org.xyzh.common.dto.sys.TbSysUserRoleDTO;

/**
 * @description    用户服务接口
 * @filename    SysUserService.java
 * @author    yslg
 * @copyright yslg
 * @since 2025-11-05
 */
public interface SysUserService {
    
    // ================= 用户基本信息管理 =================

    ResultDomain<TbSysUserDTO> registerUser(SysUserVO userVO);


    /**
     * @description    插入用户
     * @param    userVO    用户VO
     * @return    ResultDomain<TbSysUserDTO>    插入结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<TbSysUserDTO> insertUser(SysUserVO userVO);

    /**
     * @description    更新用户
     * @param    userVO    用户VO
     * @return    ResultDomain<TbSysUserDTO>    更新结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<TbSysUserDTO> updateUser(SysUserVO userVO);

    /**
     * @description    根据ID删除用户
     * @param    TbSysUserDTO    userDTO    用户DTO
     * @return    ResultDomain<Boolean>    删除结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<Boolean> deleteUser(TbSysUserDTO userDTO);

    /**
     * @description    根据ID查询用户
     * @param    filter    用户VO
     * @return    ResultDomain<SysUserVO>    查询结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<SysUserVO> getUser(SysUserVO filter);

    /**
     * @description    用户登录查询
     * @param    filter    用户VO
     * @return    ResultDomain<SysUserVO>    查询结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<SysUserVO> getLoginUser(SysUserVO filter);

    /**
     * @description    根据条件查询用户列表
     * @param    filter    用户VO
     * @return    ResultDomain<SysUserVO>    查询结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<SysUserVO> getUserList(SysUserVO filter);

    /**
     * @description    根据条件查询用户分页列表
     * @param    filter    用户VO
     * @return    ResultDomain<SysUserVO>    查询结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<SysUserVO> getUserPage(PageRequest<SysUserVO> pageRequest);

    /**
     * @description    根据用户名查询用户
     * @param    username    用户名
     * @return    ResultDomain<SysUserVO>    查询结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<SysUserVO> getUserByUsername(String username);

    /**
     * @description    更新用户密码
     * @param    userId    用户ID
     * @param    oldPassword    旧密码
     * @param    newPassword    新密码
     * @return    ResultDomain<Boolean>    更新结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<Boolean> updateUserPassword(String userId, String oldPassword, String newPassword);

    /**
     * @description    重置用户密码
     * @param    userId    用户ID
     * @return    ResultDomain<String>    新密码
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<String> resetUserPassword(String userId);

    /**
     * @description    更新用户状态
     * @param    userId    用户ID
     * @param    status    状态
     * @return    ResultDomain<Boolean>    更新结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<Boolean> updateUserStatus(String userId, String status);

    // ================= 用户详细信息管理 =================
    /**
     * @description    更新用户详细信息
     * @param    userInfoDTO    用户详细信息DTO
     * @return    ResultDomain<TbSysUserInfoDTO>    更新结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<TbSysUserInfoDTO> updateUserInfo(TbSysUserInfoDTO userInfoDTO);

    /**
     * @description    根据用户ID获取用户详细信息
     * @param    userId    用户ID
     * @return    ResultDomain<SysUserVO>    查询结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<SysUserVO> getUserInfo(String userId);

    // ================= 用户角色关联管理 =================
    /**
     * @description    添加用户角色关联
     * @param    userRoleDTO    用户角色DTO
     * @return    ResultDomain<TbSysUserRoleDTO>    添加结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<TbSysUserRoleDTO> addUserRole(TbSysUserRoleDTO userRoleDTO);

    /**
     * @description    删除用户角色关联
     * @param    userRoleDTO    用户角色DTO
     * @return    ResultDomain<Boolean>    删除结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<Boolean> removeUserRole(TbSysUserRoleDTO userRoleDTO);

    /**
     * @description    批量设置用户角色
     * @param    userId    用户ID
     * @param[]    roleIds    角色ID数组
     * @return    ResultDomain<Boolean>    设置结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<Boolean> setUserRoles(String userId, String[] roleIds);

    // ================= 用户完整信息查询 =================
    /**
     * @description    获取用户完整信息（包含部门和角色）
     * @param    userId    用户ID
     * @return    ResultDomain<UserDeptRoleVO>    查询结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<UserDeptRoleVO> getUserWithDeptRole(String userId);
}
