import { describe, expect, it } from 'vitest';
import { compareIso, compareNumber, compareText } from './reservation-sort';

const sortWith = <T>(values: T[], compare: (a: T, b: T) => number) => [...values].sort(compare);

describe('tri du tableau des réservations', () => {
    it('trie les dates comme des dates, pas comme du texte jj/mm/aaaa', () => {
        // Affichées : 31/10/2024, 31/08/2025, 28/05/2024, 30/12/2025 — l'ordre du texte affiché serait faux.
        const iso = ['2024-10-31', '2025-08-31', '2024-05-28', '2025-12-30'];
        expect(sortWith(iso, compareIso)).toEqual(['2024-05-28', '2024-10-31', '2025-08-31', '2025-12-30']);
    });

    it('trie la date de création à la seconde près', () => {
        expect(compareIso('2025-08-31 09:00:00', '2025-08-31 18:30:00')).toBeLessThan(0);
        expect(compareIso('2025-08-31 18:30:00', '2025-08-31 18:30:00')).toBe(0);
    });

    it('une date inconnue compte comme la plus ancienne', () => {
        expect(sortWith(['2025-01-02', '', '2024-01-01'], compareIso)).toEqual(['', '2024-01-01', '2025-01-02']);
    });

    it('trie les montants comme des nombres', () => {
        // « 1 132.00 » avant « 630.46 » en texte ; 630,46 avant 1 132 en nombre.
        expect(sortWith([1132, 630.46, 1405.05, 765], compareNumber)).toEqual([630.46, 765, 1132, 1405.05]);
        expect(compareNumber(Number.NaN, 10)).toBeLessThan(0);
    });

    it('trie le texte sans tenir compte de la casse ni des accents', () => {
        expect(sortWith(['Supprimé', 'confirmé', 'Demander', 'Modifié'], compareText)).toEqual(['confirmé', 'Demander', 'Modifié', 'Supprimé']);
        expect(compareText('écrin', 'Ecrin')).toBe(0);
        // Numéros de contrat : ordre naturel des nombres.
        expect(sortWith(['145114764', '99', '1000'], compareText)).toEqual(['99', '1000', '145114764']);
    });
});
