use bytes::Bytes;
use xet_core_structures::merklehash::MerkleHash;
use xet_core_structures::metadata_shard::file_structs::MDBFileInfo;
use xet_core_structures::xorb_object::SerializedXorbObject;
use super::adaptive_concurrency::ConnectionPermit;
use super::progress_tracked_streams::ProgressCallback;
use crate::cas_types::{BatchQueryReconstructionResponse, FileRange, HttpRange, QueryReconstructionResponseV2};
use crate::error::Result;
#[async_trait::async_trait]
pub trait URLProvider: Send + Sync {
async fn retrieve_url(&self) -> Result<(String, Vec<HttpRange>)>;
async fn refresh_url(&self) -> Result<()>;
}
#[cfg_attr(not(target_family = "wasm"), async_trait::async_trait)]
#[cfg_attr(target_family = "wasm", async_trait::async_trait(?Send))]
pub trait Client: Send + Sync {
async fn get_file_reconstruction_info(
&self,
file_hash: &MerkleHash,
) -> Result<Option<(MDBFileInfo, Option<MerkleHash>)>>;
async fn get_reconstruction(
&self,
file_id: &MerkleHash,
bytes_range: Option<FileRange>,
) -> Result<Option<QueryReconstructionResponseV2>>;
async fn batch_get_reconstruction(&self, file_ids: &[MerkleHash]) -> Result<BatchQueryReconstructionResponse>;
async fn acquire_download_permit(&self) -> Result<ConnectionPermit>;
async fn get_file_term_data(
&self,
url_info: Box<dyn URLProvider>,
download_permit: ConnectionPermit,
progress_callback: Option<ProgressCallback>,
uncompressed_size_if_known: Option<usize>,
) -> Result<(Bytes, Vec<u32>)>;
async fn query_for_global_dedup_shard(&self, prefix: &str, chunk_hash: &MerkleHash) -> Result<Option<Bytes>>;
async fn acquire_upload_permit(&self) -> Result<ConnectionPermit>;
async fn upload_shard(&self, shard_data: bytes::Bytes, upload_permit: ConnectionPermit) -> Result<bool>;
async fn upload_xorb(
&self,
prefix: &str,
serialized_xorb_object: SerializedXorbObject,
progress_callback: Option<ProgressCallback>,
upload_permit: ConnectionPermit,
) -> Result<u64>;
}