import { isTextSoupName, capitalize, sanitizeText, parseAllergens } from '../restaurants';

describe('isTextSoupName', () => {
    test('rozpozná "polévka"', () => {
        expect(isTextSoupName('Polévka dne')).toBe(true);
    });

    test('rozpozná "česnečka"', () => {
        expect(isTextSoupName('Česnečka s krutony')).toBe(true);
    });

    test('rozpozná "vývar"', () => {
        expect(isTextSoupName('Hovězí vývar s nudlemi')).toBe(true);
    });

    test('rozpozná "slepičí s " (parciální shoda pro slepičí vývar)', () => {
        expect(isTextSoupName('Slepičí s nudlemi')).toBe(true);
    });

    test('neklasifikuje hlavní jídlo jako polévku', () => {
        expect(isTextSoupName('Svíčková na smetaně s knedlíky')).toBe(false);
    });

    test('neklasifikuje prázdný řetězec', () => {
        expect(isTextSoupName('')).toBe(false);
    });

    test('není case-sensitive', () => {
        expect(isTextSoupName('POLÉVKA DNEŠKA')).toBe(true);
    });
});

describe('capitalize', () => {
    test('zformátuje první písmeno na velké', () => {
        expect(capitalize('svíčková')).toBe('Svíčková');
    });

    test('nechá velká písmena beze změny', () => {
        expect(capitalize('ABC')).toBe('ABC');
    });

    test('prázdný řetězec zůstane prázdný', () => {
        expect(capitalize('')).toBe('');
    });

    test('jednoznakový řetězec', () => {
        expect(capitalize('a')).toBe('A');
    });
});

describe('sanitizeText', () => {
    test('odstraní tabulátor (první výskyt)', () => {
        // replace('\t', '') odstraní tab bez přidání mezery
        expect(sanitizeText('\tKnedlíky')).toBe('Knedlíky');
    });

    test('nahradí první " , " za ", "', () => {
        // replace(' , ', ', ') nahrazuje pouze první výskyt
        expect(sanitizeText('Knedlíky , zelí')).toBe('Knedlíky, zelí');
    });

    test('ořízne okrajové mezery', () => {
        expect(sanitizeText('  Jídlo  ')).toBe('Jídlo');
    });

    test('kombinace: tab + mezera okolo čárky', () => {
        expect(sanitizeText('\tKnedlíky , zelí  ')).toBe('Knedlíky, zelí');
    });
});

describe('parseAllergens', () => {
    test('extrahuje alergeny na konci řetězce', () => {
        const result = parseAllergens('Svíčková 1,3,7');
        expect(result.cleanName).toBe('Svíčková');
        expect(result.allergens).toEqual([1, 3, 7]);
    });

    test('toleruje mezery okolo čárek v alergenech', () => {
        const result = parseAllergens('Řízek 1, 3, 7');
        expect(result.allergens).toEqual([1, 3, 7]);
    });

    test('vrátí prázdná pole pro jídlo bez alergenů', () => {
        const result = parseAllergens('Ovocný salát');
        expect(result.cleanName).toBe('Ovocný salát');
        expect(result.allergens).toEqual([]);
    });

    test('nesplete se s číslem uprostřed názvu', () => {
        const result = parseAllergens('Jídlo č. 5 bez alergenů');
        expect(result.cleanName).toBe('Jídlo č. 5 bez alergenů');
        expect(result.allergens).toEqual([]);
    });

    test('single alergen', () => {
        const result = parseAllergens('Houby 7');
        expect(result.cleanName).toBe('Houby');
        expect(result.allergens).toEqual([7]);
    });

    test('prázdný řetězec vrátí prázdné výsledky', () => {
        const result = parseAllergens('');
        expect(result.cleanName).toBe('');
        expect(result.allergens).toEqual([]);
    });
});
