import { describe, expect, it } from 'vitest';
import { correspondARecherche, type ItemRecherchable } from './select-search-match';

/**
 * Recherche d'un bénéficiaire par son IDENTITÉ FISCALE.
 *
 * Le sélecteur de la retenue à la source cherche sur le nom ET sur le
 * matricule fiscal / CIN, portés par `searchValue`. Le problème que ce
 * comportement résout : la même identité s'écrit de deux façons dans nos
 * données comme chez TEJ — `1931590/Y/A/000` d'un côté, `1931590Y` de l'autre.
 * Avec une simple comparaison de sous-chaîne, chercher par matricule oblige à
 * deviner la ponctuation de la fiche visée, ce qui revient à ne pas pouvoir
 * chercher par matricule.
 */
describe('correspondARecherche', () => {
    const fiche = (surcharges: Partial<ItemRecherchable> = {}): ItemRecherchable => ({
        name: 'Toconnect Tunisia',
        searchValue: '1931590Y ',
        ...surcharges,
    });

    it('trouve par le nom, sans tenir compte de la casse', () => {
        expect(correspondARecherche(fiche(), 'toconnect')).toBe(true);
        expect(correspondARecherche(fiche(), 'TUNISIA')).toBe(true);
        expect(correspondARecherche(fiche(), 'ariana')).toBe(false);
    });

    it('trouve par le matricule fiscal exact', () => {
        expect(correspondARecherche(fiche(), '1931590Y')).toBe(true);
        expect(correspondARecherche(fiche(), '1931590')).toBe(true);
    });

    it('trouve un matricule saisi AVEC séparateurs alors que la fiche n’en a pas', () => {
        expect(correspondARecherche(fiche(), '1931590/Y')).toBe(true);
        expect(correspondARecherche(fiche(), '1931590/Y/A/000')).toBe(false);
    });

    it('trouve un matricule saisi SANS séparateurs alors que la fiche en a', () => {
        const avecSeparateurs = fiche({ searchValue: '1931590/Y/A/000 ' });

        expect(correspondARecherche(avecSeparateurs, '1931590Y')).toBe(true);
        expect(correspondARecherche(avecSeparateurs, '1931590/Y/A/000')).toBe(true);
    });

    it('trouve un propriétaire par son CIN', () => {
        const proprietaire = fiche({ name: 'Ali Ben Salah', searchValue: ' 01234567' });

        expect(correspondARecherche(proprietaire, '01234567')).toBe(true);
        expect(correspondARecherche(proprietaire, '0123')).toBe(true);
        expect(correspondARecherche(proprietaire, '99999999')).toBe(false);
    });

    it('ne ramène pas toute la liste sur une requête d’un ou deux signes', () => {
        // Une fois les séparateurs retirés, « / » devient la chaîne vide, que
        // toute meule contient. Le seuil de trois caractères l'empêche.
        expect(correspondARecherche(fiche(), '/')).toBe(false);
        expect(correspondARecherche(fiche(), '//')).toBe(false);
    });

    it('rend tout sur une recherche vide', () => {
        expect(correspondARecherche(fiche(), '')).toBe(true);
        expect(correspondARecherche(fiche(), '   ')).toBe(true);
    });

    it('cherche aussi dans internal_name, comme avant', () => {
        const logement = { name: 'Villa Sidi Bou', internal_name: 'SB-04' };

        expect(correspondARecherche(logement, 'sb-04')).toBe(true);
        expect(correspondARecherche(logement, 'sb04')).toBe(true);
    });
});
