/**
 * Bilingual (EN / TL) search expansion for trades and worker discovery.
 * Example: "mekaniko" → also matches mechanic; "labandera" → laundry.
 */

function normalize(value: string): string {
  return value
    .normalize('NFD')
    .replace(/[\u0300-\u036f]/g, '')
    .toLowerCase()
    .replace(/[^a-z0-9\s-]/g, ' ')
    .replace(/\s+/g, ' ')
    .trim();
}

/**
 * Category slug → searchable aliases (English, Tagalog, colloquial).
 * Keep aliases short and high-signal; avoid overly fuzzy 1–2 letter tokens.
 */
export const CATEGORY_SEARCH_ALIASES: Record<string, string[]> = {
  carpenter: [
    'carpenter',
    'carpentry',
    'karpintero',
    'anluwage',
    'woodwork',
    'cabinet',
    'kabinet',
    'pinto',
    'furniture',
  ],
  plumber: [
    'plumber',
    'plumbing',
    'tubero',
    'tubo',
    'pipe',
    'septic',
    'lababo',
    'cr',
    'poso negro',
  ],
  electrician: [
    'electrician',
    'electrical',
    'elektrisyan',
    'wiring',
    'kuryente',
    'saksakan',
    'ilaw',
    'outlet',
    'breaker',
  ],
  painter: ['painter', 'painting', 'pintor', 'pinta', 'repaint', 'repainting'],
  welder: [
    'welder',
    'welding',
    'hinang',
    'tagahinang',
    'bakal',
    'metal',
    'gate',
    'rehas',
    'fabrication',
  ],
  mason: [
    'mason',
    'masonry',
    'semento',
    'concrete',
    'hollow blocks',
    'plaster',
    'plastering',
    'tagapagtayo',
  ],
  cleaner: [
    'cleaner',
    'cleaning',
    'tagalinis',
    'linis',
    'housekeeping',
    'deep clean',
    'janitor',
  ],
  'domestic-helper': [
    'katulong',
    'kasambahay',
    'domestic helper',
    'househelp',
    'house help',
    'maid',
    'all around helper',
    'helper sa bahay',
    'household helper',
    'dh',
  ],
  'aircon-technician': [
    'aircon',
    'aircon technician',
    'air conditioner',
    'ac technician',
    'hvac',
    'split type',
    'window type',
  ],
  'appliance-repair': [
    'appliance',
    'appliance repair',
    'tagaayos ng appliance',
    'ref',
    'refrigerator',
    'washing machine',
    'microwave',
    'tv repair',
  ],
  driver: [
    'driver',
    'tsuper',
    'chauffeur',
    'pagmamaneho',
    'private driver',
    'family driver',
    'airport transfer',
  ],
  gardener: [
    'gardener',
    'hardinero',
    'hardin',
    'landscaping',
    'damuhan',
    'grass cutting',
    'trim',
  ],
  handyman: [
    'handyman',
    'madiskarte',
    'all around',
    'home repair',
    'ayos bahay',
    'odd jobs',
    'general repair',
  ],
  massage: ['massage', 'masahista', 'hilot', 'therapist', 'home service massage'],
  'errand-runner': [
    'errand',
    'runner',
    'taga errand',
    'pamamalengke',
    'pickup',
    'personal assistant',
    'bili',
  ],
  mechanic: [
    'mechanic',
    'mekaniko',
    'auto mechanic',
    'car mechanic',
    'motorsiklo',
    'motor',
    'sasakyan',
    'kotse',
    'vulcanizing',
    'vulcanize',
    'gulong',
    'tire',
    'change oil',
  ],
  laundry: [
    'laundry',
    'labandera',
    'labadero',
    'labada',
    'plantsa',
    'ironing',
    'dry clean',
    'wash and fold',
  ],
  tailor: [
    'tailor',
    'mananahi',
    'sastre',
    'sewing',
    'alteration',
    'tahian',
    'dressmaker',
    'modista',
  ],
  'pest-control': [
    'pest control',
    'anay',
    'daga',
    'ipis',
    'peste',
    'exterminator',
    'termite',
  ],
  mover: [
    'mover',
    'moving',
    'tagabuhat',
    'lipat',
    'lipat bahay',
    'hakot',
    'kargador',
    'hauling',
  ],
  babysitter: [
    'babysitter',
    'yaya',
    'childcare',
    'alaga bata',
    'nanny',
    'baby sitter',
    'baby care',
    'taga alaga ng bata',
  ],
  cook: [
    'cook',
    'kusinero',
    'kusinera',
    'chef',
    'lutuan',
    'meal prep',
    'catering',
    'private cook',
  ],
  barber: [
    'barber',
    'barbero',
    'hairdresser',
    'gupit',
    'haircut',
    'stylist',
    'beautician',
    'manicurist',
    'manicure',
    'pedicure',
  ],
  'pet-care': [
    'pet care',
    'pet sitting',
    'aso',
    'dog walker',
    'hayop',
    'grooming',
    'pet sitter',
  ],
  tutor: ['tutor', 'tagapagturo', 'tutoring', 'homework', 'aral', 'review'],
  photographer: [
    'photographer',
    'larawan',
    'photoshoot',
    'portrait',
    'videographer',
    'video',
  ],
  roofer: [
    'roofer',
    'roofing',
    'bubong',
    'tagaayos ng bubong',
    'atalya',
    'leak',
    'waterproofing',
  ],
  'tile-setter': [
    'tile',
    'tile setter',
    'tiling',
    'tagalagay ng tile',
    'sahig',
    'granite',
    'marble',
  ],
  'car-washer': [
    'car washer',
    'carwasher',
    'car wash',
    'carwash',
    'auto detailing',
    'detailing',
    'hugas kotse',
    'hugas sasakyan',
    'tagahugas',
    'wash car',
    'motor wash',
  ],
  'delivery-rider': [
    'rider',
    'delivery rider',
    'delivery',
    'padala',
    'foodpanda',
    'grab food',
    'lalamove',
    'motorcycle courier',
    'courier',
    'habal',
    'habal habal',
    'motorbike delivery',
    'pabili',
  ],
  caregiver: [
    'caregiver',
    'care giver',
    'elderly care',
    'alagang matanda',
    'patient care',
    'home care',
    'nurse aide',
    'kasambahay caregiver',
  ],
  'security-guard': [
    'security guard',
    'security',
    'guard',
    'bantay',
    'watchman',
    'gwardiya',
    'security officer',
  ],
  locksmith: [
    'locksmith',
    'lock',
    'key',
    'susi',
    'duplicate key',
    'lockout',
    'door lock',
    'candado',
  ],
  'construction-helper': [
    'construction helper',
    'construction',
    'laborer',
    'peon',
    'helper',
    'konstruksiyon',
    'site helper',
    'construction worker',
    'pipa',
  ],
  other: ['other', 'iba pa'],
};

function aliasListForSlug(slug: string): string[] {
  const configured = CATEGORY_SEARCH_ALIASES[slug] ?? [];
  const fromSlug = slug.replace(/-/g, ' ');
  return [...new Set([slug, fromSlug, ...configured].map(normalize).filter(Boolean))];
}

function termMatchesAlias(term: string, alias: string): boolean {
  if (!term || !alias) return false;
  if (term === alias) return true;
  // Prefer prefix / containment for longer queries to catch "mekanik" → mekaniko
  if (term.length >= 3 && (alias.startsWith(term) || alias.includes(term))) return true;
  if (alias.length >= 4 && term.includes(alias)) return true;
  return false;
}

function matchingCategorySlugs(normalizedQuery: string): string[] {
  if (!normalizedQuery) return [];
  const tokens = normalizedQuery.split(' ').filter((t) => t.length >= 2);
  const probes = [normalizedQuery, ...tokens];

  return Object.keys(CATEGORY_SEARCH_ALIASES).filter((slug) => {
    const aliases = aliasListForSlug(slug);
    return probes.some((probe) => aliases.some((alias) => termMatchesAlias(probe, alias)));
  });
}

/**
 * Expand a user search string into related EN/TL/colloquial terms for OR matching.
 * Terms shorter than 3 characters are dropped to avoid noisy `contains` matches.
 */
export function expandSearchTerms(raw: string): string[] {
  const q = normalize(String(raw ?? ''));
  if (!q) return [];

  const terms = new Set<string>();
  if (q.length >= 2) terms.add(q);
  for (const token of q.split(' ')) {
    if (token.length >= 2) terms.add(token);
  }

  for (const slug of matchingCategorySlugs(q)) {
    for (const alias of aliasListForSlug(slug)) {
      if (alias.length >= 3) terms.add(alias);
    }
  }

  return [...terms].filter((t) => t.length >= 2);
}

/**
 * Category slugs that should match this search (for Prisma `slug: { in: [...] }`).
 */
export function categorySlugsMatchingSearch(raw: string): string[] {
  return matchingCategorySlugs(normalize(String(raw ?? '')));
}

/**
 * Extra keyword haystack for client-side filters (category pickers, etc.).
 */
export function categorySearchKeywords(slug: string, englishName?: string): string {
  const aliases = aliasListForSlug(slug);
  return [...aliases, englishName ? normalize(englishName) : ''].filter(Boolean).join(' ');
}

/**
 * Whether a free-text haystack matches a query after synonym expansion.
 */
export function matchesExpandedSearch(haystack: string, query: string): boolean {
  const q = normalize(query);
  if (!q) return true;
  const hay = normalize(haystack);
  if (!hay) return false;
  return expandSearchTerms(q).some((term) => hay.includes(term));
}
