import { beforeEach, describe, expect, it, vi } from 'vitest'

/**
 * Tests de la saisie assistée QUALIMAT (M4 Transport, ERP-166 — RG-4.01).
 *
 * `useQualimatSearch` interroge `GET /api/qualimat_carriers?search=`. On vérifie le
 * CONTRAT (pas le timing du debounce, couvert par `debounce.test.ts`) via `fetchNow` :
 *  - ressource ciblée + paramètre `search` (trimé) + header `Accept: application/ld+json` ;
 *  - consommation de l'enveloppe Hydra (`member`) ;
 *  - échec réseau → résultats vidés, pas de throw (recherche non bloquante).
 */

const mockGet = vi.hoisted(() => vi.fn())
vi.stubGlobal('useApi', () => ({
    get: mockGet,
    post: vi.fn(),
    put: vi.fn(),
    patch: vi.fn(),
    delete: vi.fn(),
}))

const { useQualimatSearch } = await import('../useQualimatSearch')

describe('useQualimatSearch', () => {
    beforeEach(() => {
        mockGet.mockReset()
    })

    it('fetchNow cible /qualimat_carriers (search trimé, ld+json) et consomme member', async () => {
        mockGet.mockResolvedValueOnce({
            member: [{ '@id': '/api/qualimat_carriers/1', id: '1', name: 'ACME', validityDate: '2027-01-01' }],
        })
        const q = useQualimatSearch()

        await q.fetchNow('  acme  ')

        expect(mockGet).toHaveBeenCalledWith(
            '/qualimat_carriers',
            { search: 'acme' },
            { headers: { Accept: 'application/ld+json' }, toast: false },
        )
        expect(q.results.value).toHaveLength(1)
        expect(q.results.value[0]?.name).toBe('ACME')
        expect(q.loading.value).toBe(false)
    })

    it('échec réseau : résultats vidés, pas de throw', async () => {
        mockGet.mockRejectedValueOnce(new Error('network'))
        const q = useQualimatSearch()

        await expect(q.fetchNow('x')).resolves.toBeUndefined()
        expect(q.results.value).toEqual([])
        expect(q.loading.value).toBe(false)
    })
})
