use anyhow::Result;
use reqwest::Client;
use tokio::fs;
use crate::state::{self, DownloadState};
use crate::utils;
pub async fn prepare_download(
url: &str,
output_filename: String,
threads: u8,
client: &Client,
) -> Result<(DownloadState, String, u64)> {
let state_filename = format!("{}.state.json", output_filename);
if let Ok(json) = fs::read_to_string(&state_filename).await
&& let Ok(state) = serde_json::from_str::<DownloadState>(&json)
&& state.url == url
{
let total_size = state.chunks.last().map(|c| c.end + 1).unwrap_or(0);
return Ok((state, state_filename, total_size));
}
let size = utils::get_file_size(url, client).await?;
let file = fs::File::create(&output_filename).await?;
file.set_len(size).await?;
let chunks = utils::calculate_chunks(size, threads as u64);
let state = DownloadState {
url: url.to_string(),
chunks,
};
state::save_state(&state, &state_filename).await?;
Ok((state, state_filename, size))
}