import type { AdministrativeInfo, LocationAlternative } from './types'; /** * India Post office-type suffixes on locality names (e.g. "Hessarghatta Lake S.O"). * These are post-office designations, not buyer-facing locality labels. */ const INDIA_POST_OFFICE_SUFFIX = /\s+(?:B\.?\s*O\.?|S\.?\s*O\.?|H\.?\s*O\.?|P\.?\s*O\.?|D\.?\s*S\.?\s*O\.?|S\.?\s*D\.?\s*O\.?|S\.?\s*B\.?\s*C\.?|C\.?\s*P\.?\s*C\.?|M\.?\s*D\.?\s*G\.?)\.?\s*$/i; /** Remove trailing India Post office suffix from a locality name. */ export function stripIndiaPostOfficeSuffix(name: string): string { return name.replace(INDIA_POST_OFFICE_SUFFIX, '').replace(/\s+/g, ' ').trim(); } /** Case-insensitive key for deduplicating locality names. */ export function localityDedupeKey(name: string): string { return stripIndiaPostOfficeSuffix(name).toLowerCase(); } export interface ProcessedLocalityLookup { adminInfo: AdministrativeInfo; alternatives: LocationAlternative[]; localityOptions: string[]; selectedLocality: string; } /** * Normalize primary locality + alternatives from location lookup: * - strip S.O / H.O / B.O style suffixes for display * - merge duplicates that differ only by office suffix */ export function processLocalityLookup( adminInfo: AdministrativeInfo, alternatives: LocationAlternative[] = [], ): ProcessedLocalityLookup { const seen = new Set(); const localityOptions: string[] = []; const addUnique = (rawName: string) => { const key = localityDedupeKey(rawName); if (!key || seen.has(key)) return; seen.add(key); localityOptions.push(stripIndiaPostOfficeSuffix(rawName)); }; addUnique(adminInfo.locality); for (const alt of alternatives) { addUnique(alt.name); } const primaryClean = stripIndiaPostOfficeSuffix(adminInfo.locality); const primaryKey = localityDedupeKey(adminInfo.locality); const cleanedAlternatives = alternatives .map((alt) => ({ ...alt, name: stripIndiaPostOfficeSuffix(alt.name), })) .filter((alt) => { const key = localityDedupeKey(alt.name); return key && key !== primaryKey; }) .filter( (alt, idx, arr) => arr.findIndex((a) => localityDedupeKey(a.name) === localityDedupeKey(alt.name)) === idx, ); return { adminInfo: { ...adminInfo, locality: primaryClean }, alternatives: cleanedAlternatives, localityOptions, selectedLocality: primaryClean, }; }