/**
 * Prédicat de recherche de `SearchableSelect`, isolé du composant.
 *
 * Module SANS AUCUN IMPORT, et c'est la raison de son existence : le composant
 * tire `./button`, qui tire `@/lib/utils`, alias que la configuration Vitest du
 * projet ne résout pas. Le test ne pouvait donc pas charger le fichier `.tsx`
 * — et une règle de correspondance non testée est une règle qui dérive.
 */

/** Champs sur lesquels un item est cherché. `searchValue` porte l'identité fiscale. */
export interface ItemRecherchable {
    name: string;
    internal_name?: string | null;
    searchValue?: string;
    [key: string]: unknown;
}

/**
 * Un item répond-il à cette recherche ?
 *
 * DEUX comparaisons, et la seconde existe pour une raison précise : un
 * matricule fiscal tunisien s'écrit « 1931590/Y/A/000 » sur une fiche et
 * « 1931590Y » sur une autre — les deux formes coexistent dans nos données
 * comme chez TEJ. Avec une simple comparaison de sous-chaîne, l'utilisateur
 * doit deviner la ponctuation exacte de la fiche qu'il cherche, ce qui revient
 * à ne pas pouvoir chercher par matricule du tout.
 *
 * La passe réduite ne fait qu'AJOUTER des résultats : la comparaison normale
 * est évaluée en premier, donc aucune recherche qui fonctionnait ne cesse de
 * fonctionner. Le seuil de trois caractères évite qu'une requête d'un ou deux
 * signes, une fois les séparateurs retirés, ne ramène toute la liste — « / »
 * réduit à la chaîne vide, que toute meule contient.
 */
export function correspondARecherche(item: ItemRecherchable, recherche: string): boolean {
    const q = recherche.trim().toLowerCase();
    if (!q) return true;

    const meule = `${item.name} ${item.internal_name ?? ''} ${item.searchValue ?? ''}`.toLowerCase();
    if (meule.includes(q)) return true;

    const sansSeparateur = (valeur: string) => valeur.replace(/[^a-z0-9]/g, '');
    const qReduite = sansSeparateur(q);

    return qReduite.length >= 3 && sansSeparateur(meule).includes(qReduite);
}
