///|
/// 归档与离线下载。
///
/// 归档端点既能看压缩包内部(`archive_meta` / `archive_list`),也能把包内
/// 内容解压到某个目录(`archive_decompress`,异步任务)。
/// `add_offline_download` 让服务端自己去下载一批 URL(离线下载/秒传)。

///|
/// 读取压缩包的结构与元信息(`POST /api/fs/archive/meta`)。
///
/// 加密的包要在 `archive_pass` 里给密码;`refresh` 会绕过服务端的归档缓存。
pub async fn FileSystem::archive_meta(
  self : FileSystem,
  path : String,
  password? : String,
  refresh? : Bool,
  archive_pass? : String,
) -> @core.ArchiveMetaResponse raise @core.OpenListError {
  let body = ArchiveMetaBody::{ path, password, refresh, archive_pass, }
  let data = self.client.request(
    @moonhttp.Method::Post,
    "/api/fs/archive/meta",
    body=@json.to_json(body),
  )
  @core.decode_data(data)
}

///|
/// 分页列出压缩包内某个目录的内容(`POST /api/fs/archive/list`)。
///
/// `inner_path` 是包内路径(`archive_meta` 没给出时留空表示根)。
pub async fn FileSystem::archive_list(
  self : FileSystem,
  path : String,
  inner_path? : String,
  password? : String,
  refresh? : Bool,
  archive_pass? : String,
  page? : Int,
  per_page? : Int,
) -> @core.PageResult[@core.ArchiveContent] raise @core.OpenListError {
  let body = ArchiveListBody::{
    path,
    inner_path,
    password,
    refresh,
    archive_pass,
    page,
    per_page,
  }
  let data = self.client.request(
    @moonhttp.Method::Post,
    "/api/fs/archive/list",
    body=@json.to_json(body),
  )
  @core.decode_data(data)
}

///|
/// 把压缩包里的内容解压到 `dst_dir`(`POST /api/fs/archive/decompress`)。
///
/// `names` 是包内要解压的条目(相对包内路径);服务端把它当异步任务跑,
/// 返回的是刚创建的任务列表(服务端字段名是 `task`,但值是数组)。
pub async fn FileSystem::archive_decompress(
  self : FileSystem,
  src_dir : String,
  dst_dir : String,
  names : Array[String],
  archive_pass? : String,
  inner_path? : String,
  cache_full? : Bool,
  put_into_new_dir? : Bool,
  overwrite? : Bool,
) -> Array[@core.TaskInfo] raise @core.OpenListError {
  let body = ArchiveDecompressBody::{
    src_dir,
    dst_dir,
    name: names,
    archive_pass,
    inner_path,
    cache_full,
    put_into_new_dir,
    overwrite,
  }
  let data = self.client.request(
    @moonhttp.Method::Post,
    "/api/fs/archive/decompress",
    body=@json.to_json(body),
  )
  decode_tasks(data)
}

///|
/// 让服务端离线下载一批 URL 到一个目录(`POST /api/fs/add_offline_download`)。
///
/// `tool` 指定用哪个离线下载工具(先用 `PublicApi::offline_download_tools`
/// 查可用列表);留空时服务端挑默认工具。空白 URL 会被服务端忽略。
/// 返回的是刚创建的任务列表(服务端字段名是 `tasks`)。
pub async fn FileSystem::add_offline_download(
  self : FileSystem,
  path : String,
  urls : Array[String],
  tool? : String,
) -> Array[@core.TaskInfo] raise @core.OpenListError {
  let body = AddOfflineDownloadBody::{ urls, path, tool, }
  let data = self.client.request(
    @moonhttp.Method::Post,
    "/api/fs/add_offline_download",
    body=@json.to_json(body),
  )
  decode_tasks(data)
}