use super::names::name_of;
use super::types::ImportPlan;
use crate::authoring::files::hash;
use crate::authoring::import::sources::Unit;
use crate::corpus::Corpus;
use anyhow::Result;
use serde_json::{Value, json};
pub(super) fn move_files(
c: &Corpus,
u: &Unit,
base: &str,
bundle_dir: &str,
out: &mut ImportPlan,
) -> Result<Vec<Value>> {
let mut files = vec![];
for ch in &u.chapters {
let rel = ch.strip_prefix(&format!("{base}/")).unwrap_or(name_of(ch));
out.plan.copy(ch.clone(), format!("{bundle_dir}/{}", rel.replace('/', "-")));
out.plan.remove(ch.clone());
}
for a in &u.attachments {
let rel = a.strip_prefix(&format!("{base}/")).unwrap_or(name_of(a)).to_string();
let (sha, bytes) = hash::file(&c.cfg.spec_home.join(a))?;
let store = if bytes > c.cfg.raw.files.inline_max_bytes { "store" } else { "repo" };
if store == "store" {
out.uploads.push((format!("{bundle_dir}/{rel}"), sha.clone()));
}
out.plan.copy(a.clone(), format!("{bundle_dir}/{rel}"));
out.plan.remove(a.clone());
files.push(json!({"path": rel, "sha256": sha, "bytes": bytes, "store": store}));
}
Ok(files)
}