use std::path::Path;
use std::time::Instant;
use anyhow::{Context as _, anyhow};
use bywind::{MapBounds, fmt::format_duration_breakdown, io::Format};
use crate::error::AppError;
pub fn run(map_path: &Path) -> Result<(), AppError> {
let fmt = Format::from_path(map_path)
.with_context(|| format!("inferring format of {}", map_path.display()))?;
eprintln!("loading {}...", map_path.display());
let load_start = Instant::now();
let map = bywind::io::load(map_path, 1, None)
.with_context(|| format!("loading wind map from {}", map_path.display()))?;
let load_dur = load_start.elapsed();
let frame_count = map.frame_count();
let step_seconds = f64::from(map.step_seconds());
let total_seconds = step_seconds * (frame_count.saturating_sub(1) as f64);
let bounds = MapBounds::from_wind_map(&map).ok_or_else(|| {
AppError::no_result(anyhow!("wind map {} has no rows", map_path.display()))
})?;
let samples_per_frame = map.frame(0).map(|f| f.rows().len()).unwrap_or(0);
eprintln!();
eprintln!("=== Wind map ===");
eprintln!("Path: {}", map_path.display());
eprintln!("Format: {} ({})", fmt.name(), describe_format(fmt));
eprintln!("Loaded in: {:.2}s", load_dur.as_secs_f64());
eprintln!("Frames: {frame_count}");
eprintln!("Step: {step_seconds} s");
eprintln!(
"Total duration: {} ({} frames × {} s)",
format_duration_breakdown(total_seconds),
frame_count,
step_seconds,
);
let bbox = bounds.bbox;
eprintln!(
"Bounding box: lon {:.3}..{:.3} lat {:.3}..{:.3}",
bbox.lon_min, bbox.lon_max, bbox.lat_min, bbox.lat_max,
);
if bounds.lon_wraps() {
eprintln!(" (wraps the antimeridian: lon_min > lon_max)");
}
match map.time_range() {
Some((start, end)) => eprintln!(
"Time range: {} → {}",
start.format("%Y-%m-%d %H:%M UTC"),
end.format("%Y-%m-%d %H:%M UTC"),
),
None => eprintln!("Time range: unknown"),
}
eprintln!("Samples / frame: {samples_per_frame}");
Ok(())
}
fn describe_format(fmt: Format) -> &'static str {
match fmt {
Format::Grib2 => "WMO GRIB2, parallel decode via the `grib` crate",
Format::WindAv1 => "bywind::wind_av1, AV1 near-lossless (header + IVF)",
}
}