import request from './request'

/**
 * 上传种子
 * @param {FormData} formData - 包含种子文件和相关信息的表单数据
 * @returns {Promise}
 */
export function uploadTorrent(formData) {
  return request({
    url: '/torrent/upload',
    method: 'post',
    data: formData,
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  })
}

/**
 * 搜索种子
 * @param {Object} searchParams - 搜索参数
 * @param {string} searchParams.keyword - 搜索关键词
 * @param {string} searchParams.category - 分类
 * @param {string} searchParams.sortBy - 排序字段
 * @param {string} searchParams.sortOrder - 排序方向
 * @param {number} searchParams.page - 页码
 * @param {number} searchParams.entriesPerPage - 每页条数
 * @returns {Promise}
 */
export function searchTorrents(searchParams) {
  return request({
    url: '/torrent/search',
    method: 'post',
    data: searchParams
  }).catch(error => {
    console.error('🚨 API请求失败:', {
      url: '/torrent/search',
      requestedURL: error.config?.url,
      baseURL: error.config?.baseURL,
      fullURL: error.config?.baseURL ? error.config.baseURL + error.config.url : error.config?.url,
      status: error.response?.status,
      statusText: error.response?.statusText
    })
    throw error
  })
}

/**
 * 获取分类列表
 * @returns {Promise}
 */
export function getCategories() {
  return request({
    url: '/category/list', // 注意这里不需要加 /api，已经在代理中配置了
    method: 'get'
  })
}

/**
 * 获取标签列表
 * @returns {Promise}
 * 暂时还没有获取标签的列表
 */
export function getTags() {
    console.log('调用获取标签列表API...')
    // 后端没有标签的Controller，返回模拟数据
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve({
          data: [
            { id: 1, name: 'linux' },
            { id: 2, name: 'ios' },
            { id: 3, name: 'ubuntu' }
          ]
        })
      }, 100)
    })
  }

/**
 * 获取种子详情
 * @param {string} infoHash - 种子的info hash
 * @returns {Promise}
 */
export function getTorrentDetail(infoHash) {
  return request({
    url: `/torrent/${infoHash}`,
    method: 'get'
  })
}