import { describe, expect, it } from 'vitest';
import { formatPourcent, formatUsd, lirePourcentage, montantGarde, remplir } from './payment-rules-utils';

// Les espaces de fr-FR (milliers : U+202F, avant « % » : aucun ici) sont
// normalisés pour comparer des chaînes lisibles.
const normalise = (texte: string) => texte.replace(/\s/g, ' ');

describe('montantGarde (miroir de RegleDePaiement::calculer)', () => {
    it('ménage + commission : ménage, puis la commission sur le reste', () => {
        // L'exemple de l'écran : 53,31 $US de ménage, 23,8 % de commission.
        expect(montantGarde('menage_commission', 1000, 53.31, 23.8, 100)).toBeCloseTo(278.6222, 4);
    });

    it('ménage : le ménage seul', () => {
        expect(montantGarde('menage', 1000, 53.31, 23.8, 100)).toBe(53.31);
    });

    it('pourcentage : X % du montant, 100 % gardant tout', () => {
        expect(montantGarde('pourcentage', 1000, 53.31, 23.8, 100)).toBe(1000);
        expect(montantGarde('pourcentage', 1000, 53.31, 23.8, 87.5)).toBe(875);
    });
});

describe('lirePourcentage (mêmes bornes que PaymentRuleRequest)', () => {
    it.each([
        ['100', 100],
        ['0', 0],
        ['87.5', 87.5],
        ['12,25', 12.25],
        [' 50 ', 50],
    ])('accepte %s', (saisie, attendu) => {
        expect(lirePourcentage(saisie)).toBe(attendu);
    });

    it.each(['', '100.01', '101', '-1', '33.333', 'abc', '1e2'])('refuse « %s »', (saisie) => {
        expect(lirePourcentage(saisie)).toBeNull();
    });
});

describe('remplir', () => {
    it('remplace les jetons connus et laisse les autres', () => {
        expect(remplir('Sur :montant versés : :garde TTC gardés (:inconnu)', { montant: 'A', garde: 'B' })).toBe(
            'Sur A versés : B TTC gardés (:inconnu)',
        );
    });

    it('produit la phrase de l’écran avec les formats fr-FR', () => {
        const phrase = remplir('Sur :montant versés : ménage :menage + :commission × :reste = :garde TTC gardés', {
            montant: formatUsd(1000),
            menage: formatUsd(53.31),
            commission: formatPourcent(23.8),
            reste: formatUsd(1000 - 53.31),
            garde: formatUsd(montantGarde('menage_commission', 1000, 53.31, 23.8, 100)),
        });

        expect(normalise(phrase)).toBe('Sur 1 000,00 $US versés : ménage 53,31 $US + 23,8 % × 946,69 $US = 278,62 $US TTC gardés');
    });
});
