Editor/Road/ArchRoadPicker.cs
namespace Sunless.Architecture;

public sealed class ArchRoadPicker : IArchPicker {
	public ArchKind Kind => ArchKind.Road;

	public void Under( ArchPicking picking ) {
		if ( picking.Node.Payload is not ArchRoadPart road ) {
			return;
		}

		var curve = road.Curve();

		if ( !curve.IsUsable || !curve.Nearest( picking.Point, out var frame, out var gap ) || gap > road.Reach() ) {
			return;
		}

		picking.Hit( ArchHitChannel.Path, gap, true );

		var at = frame.Distance;
		var crossing = road.Crossings.FirstOrDefault( entry =>
			MathF.Abs( entry.Distance - at ) < MathF.Max( 12f, entry.Width ) * 0.5f );
		var tunnel = ArchTunnel.Holding( road, at );
		var bridge = ArchBridge.Carrying( road, at );

		if ( crossing is not null ) {
			picking.HitChild( crossing, ArchHitChannel.Span, 0f, true );
		} else if ( tunnel is not null ) {
			picking.HitChild( tunnel, ArchHitChannel.Span, 0f, true );
		} else if ( bridge is not null ) {
			picking.HitChild( bridge, ArchHitChannel.Span, 0f, true );
		}
	}
}