use crate::com::variant::Variant;
use crate::error::OaResult;
use crate::office::constants::PpUpdateOption;
use crate::shapes::inventory::SlideInventory;
pub fn update_charts(
inventory: &SlideInventory,
excel_path: &str,
skip_refresh: bool,
) -> OaResult<usize> {
if inventory.charts.is_empty() {
return Ok(0);
}
let mut updated = 0;
for chart_ref in &inventory.charts {
let mut shape = chart_ref.dispatch.clone();
let mut link_format = match shape.nav("LinkFormat") {
Ok(lf) => lf,
Err(_) => continue,
};
let current_source = link_format.get("SourceFullName")
.and_then(|v| v.as_string())
.unwrap_or_default();
if current_source == "NULL" || current_source.is_empty() {
continue;
}
if skip_refresh {
let _ = link_format.put("AutoUpdate", Variant::from(PpUpdateOption::Manual as i32));
updated += 1;
super::verbose::detail(chart_ref.slide_index, &chart_ref.name, "AutoUpdate=Manual (pre-updated)");
} else {
if let Err(e) = link_format.put("SourceFullName", Variant::from(excel_path)) {
super::verbose::warn(&format!(
"Slide {:>2} │ {} · failed to set chart source: {e}",
chart_ref.slide_index, chart_ref.name));
continue;
}
let refreshed = match link_format.call0("Update") {
Ok(_) => true,
Err(e) => {
super::verbose::warn(&format!(
"Slide {:>2} │ {} · chart refresh failed: {e}",
chart_ref.slide_index, chart_ref.name));
false
}
};
let _ = link_format.put("AutoUpdate", Variant::from(PpUpdateOption::Manual as i32));
if refreshed {
updated += 1;
super::verbose::detail(chart_ref.slide_index, &chart_ref.name, "linked + refreshed");
} else {
super::verbose::detail(chart_ref.slide_index, &chart_ref.name, "refresh FAILED");
}
}
}
Ok(updated)
}