/** Great-circle distance in kilometres. */
export function distanceKm(
  a: { lat: number; lng: number },
  b: { lat: number; lng: number }
) {
  const R = 6371;
  const toRad = (d: number) => (d * Math.PI) / 180;
  const dLat = toRad(b.lat - a.lat);
  const dLng = toRad(b.lng - a.lng);
  const h =
    Math.sin(dLat / 2) ** 2 +
    Math.cos(toRad(a.lat)) * Math.cos(toRad(b.lat)) * Math.sin(dLng / 2) ** 2;
  return 2 * R * Math.asin(Math.sqrt(h));
}

/** "1.2 km away" / "18 mi away" — rounded to something a buyer can act on. */
export function describeDistance(km: number, unit: "km" | "mi" = "km") {
  const v = unit === "mi" ? km * 0.621371 : km;
  if (v < 1) return `Less than 1 ${unit} away`;
  if (v < 10) return `${v.toFixed(1)} ${unit} away`;
  return `${Math.round(v)} ${unit} away`;
}

/** Short form for cards: "2 km". */
export function shortDistance(km: number, unit: "km" | "mi" = "km") {
  const v = unit === "mi" ? km * 0.621371 : km;
  return v < 1 ? `<1 ${unit}` : `${v < 10 ? v.toFixed(1) : Math.round(v)} ${unit}`;
}

/** Reverse-geocoded names run long ("...Great Britain and Northern Ireland"). */
export function townOnly(place?: string) {
  if (!place) return "Nearby";
  return place.split(",")[0].trim();
}
