import { subTypeParentId, type SubTypeRow, type TypeRow } from './propertyTypes';

export type MacroTypeKey = 'appartement' | 'maison' | 'bureau' | 'terrain' | 'immeuble';

export const MACRO_TYPES: { key: MacroTypeKey; labelKey: string; slugs: string[] }[] = [
  { key: 'appartement', labelKey: 'properties.macroAppartement', slugs: ['appartement', 'appart'] },
  { key: 'maison', labelKey: 'properties.macroMaison', slugs: ['maison', 'villa'] },
  { key: 'bureau', labelKey: 'properties.macroBureau', slugs: ['professionnel', 'bureau', 'local', 'commerce'] },
  { key: 'terrain', labelKey: 'properties.macroTerrain', slugs: ['terrain'] },
  { key: 'immeuble', labelKey: 'properties.macroImmeuble', slugs: ['immeuble'] },
];

function norm(s: string): string {
  return s
    .toLowerCase()
    .normalize('NFD')
    .replace(/[\u0300-\u036f]/g, '')
    .trim();
}

function slugOf(row: TypeRow): string {
  const slug = norm(row.name_slug ?? '');
  return slug || norm(row.name ?? '');
}

function matchesMacro(row: TypeRow, slugs: string[]): boolean {
  const s = slugOf(row);
  const n = norm(row.name ?? '');
  return slugs.some((sl) => s === sl || s.includes(sl) || n.includes(sl));
}

export function typeIdsForMacro(key: MacroTypeKey, types: TypeRow[]): number[] {
  const spec = MACRO_TYPES.find((m) => m.key === key);
  if (!spec) return [];
  return types.filter((t) => matchesMacro(t, spec.slugs)).map((t) => t.id);
}

export function subTypeIdsForMacro(
  key: MacroTypeKey,
  types: TypeRow[],
  subTypes: SubTypeRow[],
): number[] {
  const typeIds = new Set(typeIdsForMacro(key, types));
  return subTypes.filter((st) => typeIds.has(subTypeParentId(st))).map((st) => st.id);
}
