use super::scan::collect_import_candidates;
use crate::MainWindow;
use indicatrix_vault::db::sqlite::Database;
use std::{
path::Path,
sync::{Arc, Mutex},
};
pub(super) fn count_pending_collisions(
db: &Arc<Mutex<Database>>,
path: &Path,
recurse: bool,
) -> (usize, usize) {
let candidates = collect_import_candidates(path, recurse).unwrap_or_default();
let db = db.lock().unwrap_or_else(std::sync::PoisonError::into_inner);
let collisions = candidates
.iter()
.filter(|p| {
let file_name = p.file_name().map_or_else(
|| "unknown.asc".to_string(),
|n| n.to_string_lossy().into_owned(),
);
db.has_detail_for_entry_url(&format!("local://{file_name}"))
.unwrap_or_else(|e| {
tracing::warn!("Import: collision check for '{file_name}' failed: {e}");
true
})
})
.count();
(collisions, candidates.len())
}
pub(super) fn confirm_collisions_then(
ui: &MainWindow,
collisions: usize,
total: usize,
proceed: impl FnOnce(&MainWindow) + 'static,
) {
if !collisions_need_confirmation(collisions) {
proceed(ui);
return;
}
crate::gui::editor::native_io::ask_write_confirm(
ui,
"Replace existing design(s)?",
format!(
"{collisions} of {total} file(s) have the same name as a design already in \
the catalogue and will REPLACE it (filename-only match, not a content \
comparison). Continue?"
),
"Continue",
None,
proceed,
);
}
#[must_use]
pub(super) const fn collisions_need_confirmation(collisions: usize) -> bool {
collisions > 0
}