use crate::MainWindow;
use indicatrix_vault::{db::sqlite::Database, model::filter::RangeFilter};
use slint::Weak;
use std::{
sync::{Arc, Mutex, PoisonError},
thread,
};
const SCAN_PAGE_SIZE: i64 = 500;
fn scan_missing_tilt_curve_ids(db: &Mutex<Database>) -> Vec<i64> {
let mut missing = Vec::new();
let mut after_id: Option<i64> = None;
loop {
let page = {
let guard = db.lock().unwrap_or_else(PoisonError::into_inner);
guard.search_diagrams_page(
"",
"All",
"All",
&RangeFilter::default(),
after_id,
SCAN_PAGE_SIZE,
)
};
let Ok(page) = page else { break };
let page_len = page.len();
if page_len == 0 {
break;
}
after_id = page.last().map(|item| item.id);
for item in &page {
let guard = db.lock().unwrap_or_else(PoisonError::into_inner);
if guard.has_tilt_curves(item.id).is_ok_and(|has| !has) {
missing.push(item.id);
}
}
if (page_len as i64) < SCAN_PAGE_SIZE {
break;
}
}
missing
}
pub(super) fn spawn_missing_tilt_curve_scan(
ui_weak: Weak<MainWindow>,
db: Arc<Mutex<Database>>,
on_result: impl FnOnce(&MainWindow, Vec<i64>) + Send + 'static,
) {
thread::spawn(move || {
let ids = scan_missing_tilt_curve_ids(&db);
let _ = ui_weak.upgrade_in_event_loop(move |ui| on_result(&ui, ids));
});
}