package com.test.musichouduan.service;

import com.test.musichouduan.dto.*;
import com.test.musichouduan.entity.User;

/**
 * 用户服务接口
 */
public interface UserService {

    /**
     * 用户注册
     *
     * @param request 注册请求
     * @return 用户DTO
     */
    UserDTO register(RegisterRequest request);

    /**
     * 用户登录
     *
     * @param request 登录请求
     * @return 登录结果DTO，包含用户信息和令牌信息
     */
    LoginResultDTO login(LoginRequest request);

    /**
     * 获取当前登录用户
     *
     * @return 用户DTO
     */
    UserDTO getCurrentUser();

    /**
     * 根据ID获取用户
     *
     * @param id 用户ID
     * @return 用户DTO
     */
    UserDTO getUserById(Long id);

    /**
     * 根据用户名获取用户
     *
     * @param username 用户名
     * @return 用户DTO
     */
    UserDTO getUserByUsername(String username);

    /**
     * 更新用户信息
     *
     * @param request 用户信息更新请求
     * @return 用户DTO
     */
    UserDTO updateUser(UserUpdateRequest request);

    /**
     * 修改密码
     *
     * @param request 修改密码请求
     * @return 是否成功
     */
    boolean updatePassword(PasswordUpdateRequest request);

    /**
     * 获取用户统计数据
     *
     * @param userId 用户ID
     * @return 用户DTO
     */
    UserDTO getUserStats(Long userId);

    /**
     * 分页获取用户列表
     *
     * @param page 页码
     * @param size 每页大小
     * @param keyword 关键字
     * @return 分页结果
     */
    PageResult<UserDTO> getUserList(Integer page, Integer size, String keyword);

    /**
     * 根据ID删除用户
     *
     * @param id 用户ID
     * @return 是否成功
     */
    boolean deleteUser(Long id);

    /**
     * 更新用户状态
     *
     * @param id 用户ID
     * @param status 状态
     * @return 是否成功
     */
    boolean updateUserStatus(Long id, Integer status);

    /**
     * 管理员更新用户信息
     *
     * @param id 用户ID
     * @param request 用户信息更新请求
     * @return 用户DTO
     */
    UserDTO adminUpdateUser(Long id, UserUpdateRequest request);

    /**
     * 根据ID获取用户实体
     *
     * @param id 用户ID
     * @return 用户实体
     */
    User getById(Long id);
}
