export const VALENCIA_CENTER = { lat: 39.4699, lng: -0.3763 } as const;
export const VALENCIA_COVERAGE_RADIUS_KM = 40;

export function haversineKm(lat1: number, lng1: number, lat2: number, lng2: number): number {
  const rad = (value: number) => value * Math.PI / 180;
  const dLat = rad(lat2 - lat1);
  const dLng = rad(lng2 - lng1);
  const a = Math.sin(dLat / 2) ** 2
    + Math.cos(rad(lat1)) * Math.cos(rad(lat2)) * Math.sin(dLng / 2) ** 2;
  return 6371 * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
}

function sectorFromBearing(bearing: number): string {
  const sectors = ["N", "NE", "E", "SE", "S", "SW", "W", "NW"];
  return sectors[Math.round(bearing / 45) % 8];
}

export function coverageSegment(lat: number, lng: number): string {
  const distance = haversineKm(VALENCIA_CENTER.lat, VALENCIA_CENTER.lng, lat, lng);
  const band = distance <= 15 ? "metro" : distance <= 25 ? "cercana" : "exterior";
  const y = Math.sin((lng - VALENCIA_CENTER.lng) * Math.PI / 180) * Math.cos(lat * Math.PI / 180);
  const x = Math.cos(VALENCIA_CENTER.lat * Math.PI / 180) * Math.sin(lat * Math.PI / 180)
    - Math.sin(VALENCIA_CENTER.lat * Math.PI / 180) * Math.cos(lat * Math.PI / 180)
    * Math.cos((lng - VALENCIA_CENTER.lng) * Math.PI / 180);
  const bearing = (Math.atan2(y, x) * 180 / Math.PI + 360) % 360;
  return `${band}-${sectorFromBearing(bearing)}`;
}

export function slugifyMunicipality(value: string): string {
  return value.toLowerCase()
    .normalize("NFD").replace(/[\u0300-\u036f]/g, "")
    .replace(/[’']/g, "-")
    .replace(/[^a-z0-9]+/g, "-")
    .replace(/^-|-$/g, "")
    .replace(/-+/g, "-");
}
