import request from "@/utils/request";

export const uploadTorrent = (formData) => {
  return request.post("/resource/publish", formData, {
    headers: {
      'Content-Type': 'multipart/form-data',
    },
  });
};

export const getTorrentList = (params) => {
  return request.get("resource/list/all", { params });
};

export const getTorrentListByUser = (params) => {
  return request.get("resource/list/user", { params });
};

export const getTorrentDetail = (id) => {
  return request.get(`resource/get/${id}`);
};

export const downloadTorrent = (id, username) => {
  return request.get(`/resource/download/${id}`, {
    params: {
      username: username,
    },
    responseType: 'blob', // 重要：指定响应类型为blob，用于文件下载
  });
};

export const getTorrentInfo = ({id, username}) => {
  return request.get(`/resource/get/${id}`, {
    params: {
      username: username,
    },
  });
};

export const deleteTorrent = (id) => {
  return request.delete(`resource/delete/${id}`);
};

export const searchTorrent = (params) => {
  return request.get("resource/search", { params });
};