use uzor::types::Rect;
use crate::camera::Camera2D;
use crate::graph::{Graph, NodeIndex};
use crate::particle::Particle;
pub const HOVER_TOLERANCE_PX: f64 = 6.0;
pub fn nearest_node<N, E>(
graph: &Graph<N, E>,
particles: &[Particle],
camera: &Camera2D,
viewport: Rect,
cursor_screen: (f64, f64),
candidates: &[NodeIndex],
) -> Option<NodeIndex> {
let mut best: Option<(NodeIndex, f64)> = None;
for &id in candidates {
let Some(p) = particles.get(id.index()) else { continue };
let Some(node) = graph.get_node(id) else { continue };
let screen = camera.world_to_screen((p.x as f64, p.y as f64), viewport);
let r = camera.node_screen_radius(node.radius);
let dx = cursor_screen.0 - screen.0;
let dy = cursor_screen.1 - screen.1;
let dist = (dx * dx + dy * dy).sqrt();
let slack = dist - r - HOVER_TOLERANCE_PX;
if slack <= 0.0 {
match best {
Some((_, best_slack)) if best_slack <= slack => {}
_ => best = Some((id, slack)),
}
}
}
best.map(|(id, _)| id)
}