import { describe, expect, it } from 'vitest';
import { formatDay, parseIsoDay, showsStayDates, stayRange } from './stay-dates';

describe('showsStayDates', () => {
    it('affiche les dates pour une réservation confirmée (1) et modifiée (3)', () => {
        expect(showsStayDates(1)).toBe(true);
        expect(showsStayDates(3)).toBe(true);
    });

    it("n'affiche rien pour une réservation supprimée (2) ou une simple demande (4)", () => {
        expect(showsStayDates(2)).toBe(false);
        expect(showsStayDates(4)).toBe(false);
    });

    it('reste muet quand la discussion ne porte aucune réservation', () => {
        expect(showsStayDates(null)).toBe(false);
        expect(showsStayDates(undefined)).toBe(false);
    });

    it('refuse un statut inconnu plutôt que de le supposer réel', () => {
        expect(showsStayDates(0)).toBe(false);
        expect(showsStayDates(99)).toBe(false);
    });
});

describe('parseIsoDay', () => {
    it('lit la date composant par composant, sans jamais passer par new Date', () => {
        expect(parseIsoDay('2026-03-12')).toEqual({ year: 2026, month: 3, day: 12 });
    });

    it('accepte une valeur horodatée et ne garde que le jour', () => {
        expect(parseIsoDay('2026-03-12 00:00:00')).toEqual({ year: 2026, month: 3, day: 12 });
    });

    it('rejette ce qui ne ressemble pas à une date', () => {
        expect(parseIsoDay('')).toBeNull();
        expect(parseIsoDay(null)).toBeNull();
        expect(parseIsoDay(undefined)).toBeNull();
        expect(parseIsoDay('12/03/2026')).toBeNull();
        expect(parseIsoDay('2026-13-01')).toBeNull();
        expect(parseIsoDay('2026-03-00')).toBeNull();
    });
});

describe('formatDay', () => {
    it('rend le jour en jj/mm/aaaa', () => {
        expect(formatDay('2026-03-12')).toBe('12/03/2026');
    });

    it('complète les chiffres isolés par un zéro', () => {
        expect(formatDay('2026-01-05')).toBe('05/01/2026');
    });

    it("ne décale pas d'un jour — le piège du minuit UTC", () => {
        // `new Date('2026-01-01')` vaut minuit UTC : dans un fuseau négatif, il
        // rendrait le 31/12/2025. Ce test échouerait si on repassait par Date.
        expect(formatDay('2026-01-01')).toBe('01/01/2026');
    });

    it('rend une chaîne vide sur une valeur inexploitable', () => {
        expect(formatDay(null)).toBe('');
        expect(formatDay('pas une date')).toBe('');
    });
});

describe('stayRange', () => {
    it("porte l'année des deux côtés", () => {
        expect(stayRange('2026-03-12', '2026-03-15')).toBe('12/03/2026 → 15/03/2026');
    });

    it('reste lisible sur un séjour à cheval sur deux années', () => {
        expect(stayRange('2026-12-28', '2027-01-03')).toBe('28/12/2026 → 03/01/2027');
    });

    it("se contente d'une seule borne quand l'autre manque", () => {
        expect(stayRange('2026-03-12', null)).toBe('12/03/2026');
        expect(stayRange(null, '2026-03-15')).toBe('15/03/2026');
    });

    it('rend null quand il n’y a rien à montrer, pour que la ligne ne soit pas rendue', () => {
        expect(stayRange(null, null)).toBeNull();
        expect(stayRange('', '')).toBeNull();
    });
});
