export {
  DEFAULT_REGION_SLUG,
  REGION_OPTIONS,
  REGION_SLUGS,
  SERVICE_AREA_LABELS,
  parseServiceArea,
  serviceAreaToSlug,
  isEntireRegion,
  isShowAllBrowseArea,
  buildRegionOptionGroups,
  type ServiceArea,
} from '@ehandyhire/shared';

import {
  DEFAULT_REGION_SLUG,
  buildRegionOptionGroups,
  cityLabelsForBrowseArea,
  isEntireRegion,
  isShowAllBrowseArea,
  parseServiceArea,
  SERVICE_AREA_COORDINATES,
  SERVICE_AREA_LABELS,
  serviceAreaToSlug,
  type ServiceArea,
} from '@ehandyhire/shared';
import { PHILIPPINES_CENTER } from '@/lib/geocode';

const STORAGE_KEY = 'ehh_region';
const GEOLOC_ATTEMPTED_KEY = 'ehh_region_geoloc_attempted';

export const REGION_OPTION_GROUPS = buildRegionOptionGroups();

export function regionLabel(slug: string | undefined): string {
  const area = parseServiceArea(slug);
  return area ? SERVICE_AREA_LABELS[area] : SERVICE_AREA_LABELS.ENTIRE_PHILIPPINES;
}

export function regionPath(slug: string, subpath = ''): string {
  const normalized = subpath.startsWith('/') ? subpath : subpath ? `/${subpath}` : '';
  return `/region/${slug}${normalized}`;
}

export function homePath(slug: string): string {
  return slug === DEFAULT_REGION_SLUG ? '/' : regionPath(slug);
}

export function readStoredRegionSlug(): string | null {
  if (typeof window === 'undefined') return null;
  const stored = localStorage.getItem(STORAGE_KEY);
  return stored && parseServiceArea(stored) ? stored : null;
}

export function storeRegionSlug(slug: string) {
  if (typeof window === 'undefined') return;
  localStorage.setItem(STORAGE_KEY, slug);
}

export function readGeolocAttempted(): boolean {
  if (typeof window === 'undefined') return false;
  return localStorage.getItem(GEOLOC_ATTEMPTED_KEY) === '1';
}

export function markGeolocAttempted() {
  if (typeof window === 'undefined') return;
  localStorage.setItem(GEOLOC_ATTEMPTED_KEY, '1');
}

export function parseRegionFromPath(pathname: string): string | null {
  const match = pathname.match(/^\/region\/([^/]+)/);
  if (!match) return null;
  return parseServiceArea(match[1]) ? match[1] : null;
}

export function areaQueryParam(slug: string | undefined): string | undefined {
  if (!slug) return undefined;
  const area = parseServiceArea(slug);
  if (!area || isShowAllBrowseArea(area)) return undefined;
  return slug;
}

export function isDefaultPhilippinesBrowse(slug: string | undefined): boolean {
  const area = parseServiceArea(slug);
  return !area || isShowAllBrowseArea(area);
}

/** @deprecated Use isDefaultPhilippinesBrowse */
export const isDefaultMindanaoBrowse = isDefaultPhilippinesBrowse;

export function appendAreaQuery(params: URLSearchParams, slug: string | undefined) {
  const area = areaQueryParam(slug);
  if (area) params.set('area', area);
}

export function resolveBrowseRegionSlug(
  regionSlugFromPath?: string,
  contextSlug?: string
): string | undefined {
  return regionSlugFromPath ?? contextSlug;
}

export interface RegionMapViewport {
  center: { lat: number; lng: number };
  zoom: number;
}

export function getRegionMapViewport(slug: string | undefined): RegionMapViewport {
  const area: ServiceArea = parseServiceArea(slug) ?? 'ENTIRE_PHILIPPINES';
  const center = SERVICE_AREA_COORDINATES[area] ?? PHILIPPINES_CENTER;

  if (area === 'ENTIRE_PHILIPPINES') {
    return { center, zoom: 6 };
  }
  if (area === 'ENTIRE_LUZON' || area === 'ENTIRE_VISAYAS' || area === 'ENTIRE_MINDANAO') {
    return { center, zoom: 7 };
  }
  if (isEntireRegion(area)) {
    return { center, zoom: 8 };
  }
  return { center, zoom: 12 };
}

export function getWorkerPortalMapViewport(
  workerProfile?: { serviceAreas?: { area: string }[] } | null,
  contextSlug?: string
): RegionMapViewport {
  const firstArea = workerProfile?.serviceAreas?.[0]?.area;
  if (firstArea && parseServiceArea(serviceAreaToSlug(firstArea as ServiceArea))) {
    return getRegionMapViewport(serviceAreaToSlug(firstArea as ServiceArea));
  }
  return getRegionMapViewport(contextSlug);
}

export function isRegionFilterActive(regionSlug: string | undefined | null): boolean {
  if (!regionSlug?.trim()) return false;
  const area = parseServiceArea(regionSlug);
  return Boolean(area && !isShowAllBrowseArea(area));
}

export function jobMatchesRegion(
  location: string | undefined | null,
  regionSlug: string
): boolean {
  if (!isRegionFilterActive(regionSlug)) return true;

  const loc = location ?? '';
  const area = parseServiceArea(regionSlug);
  if (!area) return true;

  if (isEntireRegion(area)) {
    return cityLabelsForBrowseArea(area).some((label) => loc.includes(label));
  }

  return loc.includes(SERVICE_AREA_LABELS[area]);
}
