import request from './request'

export const userApi = {
  /**
   * 获取当前用户信息
   * @returns {Promise<Object>} 用户信息
   */
  getCurrentUser() {
    return request({
      url: '/user/profile',
      method: 'get'
    })
  },

  /**
   * 更新用户资料
   * @param {Object} profileData - 用户资料数据
   * @returns {Promise<Object>} 更新响应
   */
  updateProfile(profileData) {
    return request({
      url: '/user/profile',
      method: 'put',
      data: profileData
    })
  },

  /**
   * 修改密码
   * @param {Object} passwordData - 密码数据
   * @param {string} passwordData.currentPassword - 当前密码
   * @param {string} passwordData.newPassword - 新密码
   * @returns {Promise<Object>} 修改响应
   */
  changePassword(passwordData) {
    return request({
      url: '/user/password',
      method: 'put',
      data: passwordData
    })
  },

  /**
   * 上传头像
   * @param {FormData} formData - 包含头像文件的FormData
   * @returns {Promise<Object>} 上传响应
   */
  uploadAvatar(formData) {
    return request({
      url: '/user/avatar',
      method: 'post',
      data: formData,
      headers: {
        'Content-Type': 'multipart/form-data'
      }
    })
  },

  /**
   * 获取用户统计信息
   * @returns {Promise<Object>} 统计信息
   */
  getUserStats() {
    return request({
      url: '/user/stats',
      method: 'get'
    })
  },

  /**
   * 获取用户活动记录
   * @param {Object} params - 查询参数
   * @param {string} params.type - 活动类型
   * @param {number} params.page - 页码
   * @param {number} params.size - 每页大小
   * @returns {Promise<Object>} 活动记录
   */
  getUserActivities(params = {}) {
    return request({
      url: '/user/activities',
      method: 'get',
      params
    })
  },

  /**
   * 获取用户上传的种子
   * @param {Object} params - 查询参数
   * @param {number} params.page - 页码
   * @param {number} params.size - 每页大小
   * @returns {Promise<Object>} 种子列表
   */
  getUserTorrents(params = {}) {
    return request({
      url: '/user/torrents',
      method: 'get',
      params
    })
  },

  /**
   * 获取登录历史
   * @param {Object} params - 查询参数
   * @param {number} params.page - 页码
   * @param {number} params.size - 每页大小
   * @returns {Promise<Object>} 登录历史
   */
  getLoginHistory(params = {}) {
    return request({
      url: '/user/login-history',
      method: 'get',
      params
    })
  }
}
