import { describe, expect, it } from 'vitest';
import { coHostFromSearch, franchiseName, HEADQUARTERS_VALUE, scopeQuery, withCoHost } from './yield-scope';

describe('scopeQuery', () => {
    it('garde la franchise consultée dans les paramètres de navigation', () => {
        expect(scopeQuery('7001')).toEqual({ coHost: '7001' });
    });

    it('ne porte rien hors consultation (vue du siège, ou franchise)', () => {
        expect(scopeQuery(null)).toEqual({});
        expect(scopeQuery(undefined)).toEqual({});
        expect(scopeQuery('')).toEqual({});
    });
});

describe('coHostFromSearch', () => {
    it('lit le paramètre de l’URL de la page', () => {
        expect(coHostFromSearch('?coHost=7001')).toBe('7001');
        expect(coHostFromSearch('?page=2&coHost=7002')).toBe('7002');
    });

    it('rend null sans paramètre ou sur une valeur vide', () => {
        expect(coHostFromSearch('')).toBeNull();
        expect(coHostFromSearch('?page=2')).toBeNull();
        expect(coHostFromSearch('?coHost=')).toBeNull();
    });
});

describe('withCoHost', () => {
    it('ajoute le paramètre à une URL absolue rendue par route()', () => {
        expect(withCoHost('https://app.test/yield/12/config', '7001')).toBe('https://app.test/yield/12/config?coHost=7001');
    });

    it('le combine à une requête existante, sans toucher au fragment', () => {
        expect(withCoHost('/yield/calendar?x=1#grille', '7001')).toBe('/yield/calendar?x=1&coHost=7001#grille');
    });

    it('ne double jamais un paramètre déjà présent', () => {
        expect(withCoHost('/yield/12/config?coHost=7002', '7001')).toBe('/yield/12/config?coHost=7002');
    });

    it('laisse l’URL intacte hors consultation', () => {
        expect(withCoHost('/yield/12/config', null)).toBe('/yield/12/config');
    });
});

describe('franchiseName', () => {
    const options = [
        { id: '7001', name: 'Franchise A' },
        { id: '7002', name: 'Franchise B' },
    ];

    it('nomme la franchise consultée', () => {
        expect(franchiseName('7002', options)).toBe('Franchise B');
    });

    it('rend null hors consultation, et l’identifiant pour une franchise inconnue de la liste', () => {
        expect(franchiseName(null, options)).toBeNull();
        expect(franchiseName('9999', options)).toBe('9999');
    });
});

describe('HEADQUARTERS_VALUE', () => {
    it('n’est pas vide : Radix Select refuse une valeur vide', () => {
        expect(HEADQUARTERS_VALUE.length).toBeGreaterThan(0);
    });
});
