/**
 * 计算两个经纬度之间的距离（Haversine 公式）
 * @returns 距离（米）
 */
export function calculateDistance(
  lat1: number,
  lon1: number,
  lat2: number,
  lon2: number,
): number {
  const R = 6371000; // 地球半径（米）
  const dLat = toRad(lat2 - lat1);
  const dLon = toRad(lon2 - lon1);
  const a =
    Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(toRad(lat1)) *
      Math.cos(toRad(lat2)) *
      Math.sin(dLon / 2) *
      Math.sin(dLon / 2);
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  return R * c;
}

function toRad(deg: number): number {
  return (deg * Math.PI) / 180;
}

/**
 * 工作日起点偏移（小时）。凌晨 < 此小时数 视为「前一天的工作日」，
 * 解决晚班/夜班跨午夜场景：23:00 签到 → 03:00 签退应归同一个 workday。
 */
export const WORKDAY_START_HOUR = 5;

/**
 * 获取签到点时区下的「工作日日期」（YYYY-MM-DD）。
 * 工作日窗口 = [当地 05:00, 次日 05:00)。当地 00:00–04:59 归到前一天。
 */
export function getLocalDate(timezone: string, date?: Date): string {
  const d = date ?? new Date();
  const shifted = new Date(d.getTime() - WORKDAY_START_HOUR * 60 * 60 * 1000);
  return shifted.toLocaleDateString('en-CA', { timeZone: timezone });
}
