import { formatDate, getUsersByLocation, parseToken, checkQueryParams, checkBodyParams, getIsWeekend } from '../utils';

describe('formatDate', () => {
    const d = new Date('2025-01-10');

    test('výchozí formát YYYY-MM-DD', () => {
        expect(formatDate(d)).toBe('2025-01-10');
    });

    test('vlastní formát DD.MM.YYYY', () => {
        expect(formatDate(d, 'DD.MM.YYYY')).toBe('10.01.2025');
    });

    test('nulové doplnění dne a měsíce', () => {
        expect(formatDate(new Date('2025-03-05'))).toBe('2025-03-05');
    });
});

describe('getIsWeekend', () => {
    test('pondělí není víkend', () => {
        expect(getIsWeekend(new Date('2025-01-06'))).toBe(false);
    });
    test('pátek není víkend', () => {
        expect(getIsWeekend(new Date('2025-01-10'))).toBe(false);
    });
    test('sobota je víkend', () => {
        expect(getIsWeekend(new Date('2025-01-11'))).toBe(true);
    });
    test('neděle je víkend', () => {
        expect(getIsWeekend(new Date('2025-01-12'))).toBe(true);
    });
});

describe('getUsersByLocation', () => {
    const choices = {
        SLADOVNICKA: { alice: { trusted: false, selectedFoods: [] } },
        TECHTOWER: { bob: { trusted: true, selectedFoods: [] } },
    } as any;

    test('vrátí spolužáky ze stejného místa', () => {
        expect(getUsersByLocation(choices, 'alice')).toEqual(['alice']);
    });

    test('vrátí prázdné pole pro neznámý login', () => {
        expect(getUsersByLocation(choices, 'charlie')).toEqual([]);
    });

    test('vrátí prázdné pole pro chybějící login', () => {
        expect(getUsersByLocation(choices, undefined)).toEqual([]);
    });
});

describe('parseToken', () => {
    test('vrátí token z Authorization hlavičky', () => {
        const req = { headers: { authorization: 'Bearer mytoken' } };
        expect(parseToken(req)).toBe('mytoken');
    });

    test('vrátí undefined pro chybějící hlavičku', () => {
        expect(parseToken({ headers: {} })).toBeUndefined();
    });

    test('vrátí undefined pro chybějící req', () => {
        expect(parseToken(undefined)).toBeUndefined();
    });
});

describe('checkQueryParams', () => {
    test('nevyhodí chybu pro přítomné parametry', () => {
        const req = { query: { date: '2025-01-10', location: 'SLADOVNICKA' } };
        expect(() => checkQueryParams(req, ['date', 'location'])).not.toThrow();
    });

    test('vyhodí chybu pro chybějící parametr', () => {
        const req = { query: { date: '2025-01-10' } };
        expect(() => checkQueryParams(req, ['date', 'location'])).toThrow("'location'");
    });
});

describe('checkBodyParams', () => {
    test('nevyhodí chybu pro přítomné parametry', () => {
        const req = { body: { login: 'alice' } };
        expect(() => checkBodyParams(req, ['login'])).not.toThrow();
    });

    test('vyhodí chybu pro chybějící parametr', () => {
        const req = { body: {} };
        expect(() => checkBodyParams(req, ['login'])).toThrow("'login'");
    });
});
