import { describe, it, expect } from 'vitest'
import {
    buildProviderContactPayload,
    hasAtLeastOneFilledContact,
    isProviderContactBlank,
    isProviderContactNamed,
} from '../providerContact'
import { emptyProviderContact } from '~/modules/technique/types/providerForm'

/**
 * Helpers purs de l'onglet Contact prestataire (ERP-142). On verifie la
 * definition de « bloc vide » (RG-3.04, alignee sur le back) et la construction
 * du payload de sous-ressource.
 */
describe('providerContact helpers', () => {
    describe('isProviderContactBlank (RG-3.04)', () => {
        it('un bloc vierge est vide', () => {
            expect(isProviderContactBlank(emptyProviderContact())).toBe(true)
        })

        it('un seul champ rempli parmi nom/prenom/fonction/tel/email suffit a le rendre non vide', () => {
            for (const field of ['firstName', 'lastName', 'jobTitle', 'phonePrimary', 'email'] as const) {
                const contact = { ...emptyProviderContact(), [field]: 'x' }
                expect(isProviderContactBlank(contact)).toBe(false)
            }
        })

        it('ignore les espaces (trim) — un champ blanc ne compte pas', () => {
            expect(isProviderContactBlank({ ...emptyProviderContact(), lastName: '   ' })).toBe(true)
        })

        it('un 2e telephone seul NE suffit PAS (exclu, comme le back)', () => {
            const contact = { ...emptyProviderContact(), hasSecondaryPhone: true, phoneSecondary: '0102030405' }
            expect(isProviderContactBlank(contact)).toBe(true)
        })
    })

    describe('isProviderContactNamed (RG-3.04 — prenom OU nom)', () => {
        it('vrai avec un prenom seul ou un nom seul', () => {
            expect(isProviderContactNamed({ ...emptyProviderContact(), firstName: 'Jean' })).toBe(true)
            expect(isProviderContactNamed({ ...emptyProviderContact(), lastName: 'Dupont' })).toBe(true)
        })

        it('faux si seuls fonction / telephone / email sont remplis (ne suffit pas)', () => {
            expect(isProviderContactNamed({ ...emptyProviderContact(), jobTitle: 'Directeur' })).toBe(false)
            expect(isProviderContactNamed({ ...emptyProviderContact(), email: 'a@b.fr' })).toBe(false)
            expect(isProviderContactNamed({ ...emptyProviderContact(), phonePrimary: '0102030405' })).toBe(false)
        })
    })

    describe('hasAtLeastOneFilledContact (RG-3.12 — au moins un contact nomme)', () => {
        it('false si aucun bloc n\'est nomme', () => {
            expect(hasAtLeastOneFilledContact([emptyProviderContact(), { ...emptyProviderContact(), email: 'a@b.fr' }])).toBe(false)
        })

        it('true des qu\'un bloc porte un nom ou prenom', () => {
            expect(hasAtLeastOneFilledContact([
                emptyProviderContact(),
                { ...emptyProviderContact(), lastName: 'Dupont' },
            ])).toBe(true)
        })
    })

    describe('buildProviderContactPayload', () => {
        it('mappe les champs et envoie null pour les vides', () => {
            const payload = buildProviderContactPayload({ ...emptyProviderContact(), lastName: 'Doe' })
            expect(payload).toEqual({
                firstName: null,
                lastName: 'Doe',
                jobTitle: null,
                phonePrimary: null,
                phoneSecondary: null,
                email: null,
            })
        })

        it('n\'envoie le 2e telephone que si revele (max 2)', () => {
            const masque = buildProviderContactPayload({
                ...emptyProviderContact(),
                phoneSecondary: '0102030405',
                hasSecondaryPhone: false,
            })
            expect(masque.phoneSecondary).toBeNull()

            const revele = buildProviderContactPayload({
                ...emptyProviderContact(),
                phoneSecondary: '0102030405',
                hasSecondaryPhone: true,
            })
            expect(revele.phoneSecondary).toBe('0102030405')
        })
    })
})
