use crate::foundation::{GeoError, Result};
use std::path::Path;
#[derive(Debug, Clone)]
pub struct TopRecord {
pub name: String,
pub md: f64,
}
pub fn load(path: &Path, name_col: &str, md_col: &str) -> Result<Vec<TopRecord>> {
let mut rdr =
csv::Reader::from_path(path).map_err(|e| GeoError::Parse(format!("tops CSV: {e}")))?;
let headers = rdr
.headers()
.map_err(|e| GeoError::Parse(format!("tops CSV: bad header: {e}")))?;
let find = |col: &str| {
headers
.iter()
.position(|h| h == col)
.ok_or_else(|| GeoError::NotFound(format!("tops CSV: column '{col}'")))
};
let (ni, mi) = (find(name_col)?, find(md_col)?);
let mut out = Vec::new();
for (row, rec) in rdr.records().enumerate() {
let rec = rec.map_err(|e| GeoError::Parse(format!("tops CSV: row {row}: {e}")))?;
let name = rec
.get(ni)
.ok_or_else(|| GeoError::Parse(format!("tops CSV: row {row}: missing name")))?
.to_string();
let md_s = rec
.get(mi)
.ok_or_else(|| GeoError::Parse(format!("tops CSV: row {row}: missing md")))?;
let md = md_s
.trim()
.parse::<f64>()
.map_err(|e| GeoError::Parse(format!("tops CSV: row {row}: bad md '{md_s}': {e}")))?;
out.push(TopRecord { name, md });
}
Ok(out)
}