import request from './request'

export const userApi = {
  /**
   * 获取当前用户信息
   * @returns {Promise<Object>} 用户信息
   */
  getCurrentUser() {
    return request({
      url: '/auth/status',
      method: 'get'
    })
  },

  /**
   * 获取用户分享率和统计信息
   * @returns {Promise<Object>} 分享率统计信息
   */
  getUserRatioInfo() {
    return request({
      url: '/torrent/ratio/info',
      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
    })
  }
}
