/** Tính khoảng cách giữa hai toạ độ để đối chiếu check-in với vị trí điểm bán. */

const EARTH_RADIUS_METERS = 6_371_000;

/**
 * Khoảng cách vòng lớn (haversine), đơn vị mét.
 *
 * Đủ chính xác cho mục đích ở đây: xác định NVKD có đứng tại điểm bán hay không,
 * với sai số vài mét trên quãng đường vài trăm mét.
 */
export function distanceMeters(
  from: { lat: number; lng: number },
  to: { lat: number; lng: number },
): number {
  const toRad = (degrees: number) => (degrees * Math.PI) / 180;

  const dLat = toRad(to.lat - from.lat);
  const dLng = toRad(to.lng - from.lng);
  const lat1 = toRad(from.lat);
  const lat2 = toRad(to.lat);

  const a =
    Math.sin(dLat / 2) ** 2 + Math.sin(dLng / 2) ** 2 * Math.cos(lat1) * Math.cos(lat2);

  return 2 * EARTH_RADIUS_METERS * Math.asin(Math.min(1, Math.sqrt(a)));
}

/** Bán kính cho phép quanh điểm bán, đọc từ biến môi trường. */
export function checkinRadiusMeters(): number {
  const configured = Number(process.env.CHECKIN_RADIUS_METERS);
  return Number.isFinite(configured) && configured > 0 ? configured : 300;
}
