from __future__ import annotations
import html
from .models import GeoPoint
def build_route_svg(points: list[GeoPoint], route_indices: list[int]) -> str:
if not points or not route_indices:
return ""
width = 760
height = 420
padding = 46
lats = [point.lat for point in points]
lons = [point.lon for point in points]
min_lat, max_lat = min(lats), max(lats)
min_lon, max_lon = min(lons), max(lons)
lat_span = max(max_lat - min_lat, 0.001)
lon_span = max(max_lon - min_lon, 0.001)
def project(point: GeoPoint) -> tuple[float, float]:
x = padding + (point.lon - min_lon) / lon_span * (width - 2 * padding)
y = height - padding - (point.lat - min_lat) / lat_span * (height - 2 * padding)
return x, y
projected = [project(point) for point in points]
route_points = [projected[idx] for idx in route_indices]
polyline = " ".join(f"{x:.1f},{y:.1f}" for x, y in route_points)
marker_svg = []
first_visit_number: dict[int, int] = {}
for order, idx in enumerate(route_indices, start=1):
first_visit_number.setdefault(idx, order)
for idx, point in enumerate(points):
x, y = projected[idx]
order = first_visit_number.get(idx, idx + 1)
is_start = idx == 0
fill = "#0f766e" if is_start else "#2563eb"
marker_svg.append(
f"""