import { describe, expect, it } from 'vitest';
import { barreFinance, groupe, GROUPES_FINANCE, ongletActif, ongletsVisibles, type FinanceAcces } from './finance-navigation';

const rien: FinanceAcces = {
    revenue: false,
    factures: false,
    recouvrements: false,
    paiements: false,
    clictopay: false,
    caisse: false,
    depenses: false,
    recus: false,
    retenue: false,
    fournisseurs: false,
};
const tout: FinanceAcces = Object.fromEntries(Object.keys(rien).map((k) => [k, true])) as FinanceAcces;

describe('navigation Finances & Caisse', () => {
    it('range huit écrans en trois groupes, sans doublon', () => {
        const hrefs = GROUPES_FINANCE.flatMap((g) => g.onglets.map((o) => o.href));
        expect(hrefs).toHaveLength(8);
        expect(new Set(hrefs).size).toBe(8);
    });

    it('ne montre que les écrans permis, dans l’ordre du groupe', () => {
        const encaissements = groupe('encaissements');
        expect(ongletsVisibles(encaissements, tout).map((o) => o.ecran)).toEqual(['recouvrements', 'paiements', 'clictopay']);
        // Gérant : liens de paiement seulement — jamais « Paiements reçus », qui répondrait 403.
        expect(ongletsVisibles(encaissements, { ...rien, clictopay: true }).map((o) => o.ecran)).toEqual(['clictopay']);
    });

    it('un admin sans retenue ne voit que les fiches fiscales', () => {
        expect(ongletsVisibles(groupe('fiscalite'), { ...tout, retenue: false }).map((o) => o.ecran)).toEqual(['fournisseurs']);
    });

    it('rien à montrer sans connexion', () => {
        expect(ongletsVisibles(groupe('caisse'), null)).toEqual([]);
        expect(ongletsVisibles(groupe('caisse'), rien)).toEqual([]);
    });

    it('la barre du haut montre le groupe de l’écran, avec ses onglets permis', () => {
        const barre = barreFinance('/depenses?page=2', tout);
        expect(barre?.groupe.cle).toBe('caisse');
        expect(barre?.actif.ecran).toBe('depenses');
        expect(barre?.actif.ancre).toBe('depenses-onglets');
        expect(barre?.onglets.map((o) => o.ecran)).toEqual(['caisse', 'depenses', 'recus']);
        // Fiche de détail : le même groupe, le même onglet actif.
        expect(barreFinance('/paiements/lignes/42', tout)?.actif.ecran).toBe('paiements');
    });

    it('la barre garde son titre quand il n’y a rien à choisir', () => {
        // Hors groupe.
        expect(barreFinance('/factures', tout)).toBeNull();
        expect(barreFinance('/revenue', tout)).toBeNull();
        // Un seul écran permis dans le groupe (gérant : liens de paiement seulement).
        expect(barreFinance('/paiements/en-ligne', { ...rien, clictopay: true, caisse: true, recus: true })).toBeNull();
        // Non connecté.
        expect(barreFinance('/recus', null)).toBeNull();
    });

    it('reconnaît l’onglet d’une adresse, fiches de détail et paramètres compris', () => {
        const encaissements = groupe('encaissements');
        expect(ongletActif(encaissements, '/paiements/lignes')?.ecran).toBe('paiements');
        expect(ongletActif(encaissements, '/paiements/lignes/42')?.ecran).toBe('paiements');
        expect(ongletActif(encaissements, '/paiements/en-ligne?coHost=3')?.ecran).toBe('clictopay');
        expect(ongletActif(encaissements, '/recouvrements/abc')?.ecran).toBe('recouvrements');
        // Un préfixe sans barre n'est pas le même écran.
        expect(ongletActif(groupe('caisse'), '/recus-archives')).toBeUndefined();
        expect(ongletActif(encaissements, '/paiements')).toBeUndefined();
    });
});
