import { describe, expect, it } from 'vitest';
import { createWhitelist, MIN_CHECKED_LENGTH } from './whitelist';

describe('createWhitelist — liste statique', () => {
    const liste = createWhitelist();

    it('accepte les noms de canaux', () => {
        for (const canal of ['Airbnb', 'Booking', 'Expedia', 'WhatsApp', 'Vrbo', 'Agoda']) {
            expect(liste.has(canal)).toBe(true);
        }
    });

    it('éclate les entrées à plusieurs mots', () => {
        expect(liste.has('Landlord')).toBe(true);
        expect(liste.has('Rentals')).toBe(true);
        expect(liste.has('United')).toBe(true);
    });

    it('éclate aussi les noms contenant un point, que le tokenizer découpe', () => {
        expect(liste.has('Booking')).toBe(true);
        expect(liste.has('com')).toBe(true);
    });

    it('accepte les villes et gouvernorats tunisiens', () => {
        for (const lieu of ['Hammamet', 'Djerba', 'Sousse', 'Kélibia', 'Médenine', 'Gammarth']) {
            expect(liste.has(lieu)).toBe(true);
        }
    });

    it('accepte les lieux écrits sans accent, comme ils sont souvent tapés', () => {
        expect(liste.has('Medenine')).toBe(true);
        expect(liste.has('Kelibia')).toBe(true);
        expect(liste.has('beja')).toBe(true);
    });

    it('ne blanchit pas un mot ordinaire', () => {
        expect(liste.has('chambre')).toBe(false);
        expect(liste.has('bonjour')).toBe(false);
    });
});

describe('createWhitelist — mots dynamiques', () => {
    it('accepte le nom du logement et celui du voyageur fournis par l’appelant', () => {
        const liste = createWhitelist(['Villa des Artistes', 'Jean-Philippe Dubourg']);

        expect(liste.has('Artistes')).toBe(true);
        expect(liste.has('Dubourg')).toBe(true);
        expect(liste.has('Jean-Philippe')).toBe(true);
    });

    it('n’altère pas la liste statique', () => {
        const liste = createWhitelist(['Dar Ennour']);

        expect(liste.has('Airbnb')).toBe(true);
        expect(liste.has('Ennour')).toBe(true);
    });
});

describe('isIgnored', () => {
    const liste = createWhitelist(['Dar Ennour']);

    it('ignore les jetons de moins de 3 caractères', () => {
        expect(MIN_CHECKED_LENGTH).toBe(3);
        expect(liste.isIgnored('ok')).toBe(true);
        expect(liste.isIgnored('a')).toBe(true);
        expect(liste.isIgnored('lit')).toBe(false);
    });

    it('ignore tout mot contenant un chiffre', () => {
        expect(liste.isIgnored('A340')).toBe(true);
        expect(liste.isIgnored('villa12')).toBe(true);
    });

    it('ignore les nombres', () => {
        expect(liste.isIgnored('2024')).toBe(true);
    });

    it('ignore les mots tout en majuscules', () => {
        expect(liste.isIgnored('RIB')).toBe(true);
        expect(liste.isIgnored('TTC')).toBe(true);
        expect(liste.isIgnored('Ttc')).toBe(false);
    });

    it('ignore les formes d’URL et d’e-mail reçues d’un seul tenant', () => {
        expect(liste.isIgnored('contact@thelandlord.tn')).toBe(true);
        expect(liste.isIgnored('https://thelandlord.tn')).toBe(true);
        expect(liste.isIgnored('www.booking.com')).toBe(true);
    });

    it('ignore les abréviations métier, que le dictionnaire Hunspell ne connaît pas', () => {
        expect(liste.isIgnored('svp')).toBe(true);
        expect(liste.isIgnored('rdv')).toBe(true);
        expect(liste.isIgnored('wifi')).toBe(true);
    });

    it('ne prend pas un mot arabe pour un sigle — l’arabe ignore la casse', () => {
        expect(liste.isIgnored('الحجز')).toBe(false);
    });

    it('ignore les mots de la liste, statiques comme dynamiques', () => {
        expect(liste.isIgnored('Hammamet')).toBe(true);
        expect(liste.isIgnored('Ennour')).toBe(true);
    });

    it('n’ignore pas un mot français ordinaire — c’est lui qu’on veut vérifier', () => {
        expect(liste.isIgnored('chambre')).toBe(false);
        expect(liste.isIgnored('bonjour')).toBe(false);
        expect(liste.isIgnored("l'hôtel")).toBe(false);
    });
});
