/**
 * Helpers purs de l'onglet Comptabilite prestataire (M3 Technique, ERP-144) —
 * miroir SIMPLIFIE des regles M2, reimplemente cote module Technique (regle
 * ABSOLUE n°1 : pas d'import inter-module). Portent les RG inter-champs RG-3.07
 * (banque si VIREMENT) et RG-3.08 (RIB si LCR), testables sans Vue ni API.
 */

import type {
    ProviderAccountingDraft,
    ProviderRibFormDraft,
} from '~/modules/technique/types/providerForm'

/** Code pivot du type de reglement imposant une banque (RG-3.07). */
const PAYMENT_TYPE_VIREMENT = 'VIREMENT'
/** Code pivot du type de reglement imposant au moins un RIB (RG-3.08). */
const PAYMENT_TYPE_LCR = 'LCR'

/** Champs RIB obligatoires non nullable cote back (NotBlank) — omis si vides au POST. */
const RIB_REQUIRED_NON_NULLABLE_KEYS = ['label', 'bic', 'iban'] as const

/** Vrai si une chaine porte au moins un caractere non-espace. */
function isFilled(value: string | null | undefined): boolean {
    return value !== null && value !== undefined && value.trim() !== ''
}

/** RG-3.07 : la banque n'est requise/visible que pour un reglement par VIREMENT. */
export function isBankRequiredForPaymentType(code: string | null | undefined): boolean {
    return code === PAYMENT_TYPE_VIREMENT
}

/** RG-3.08 : au moins un RIB n'est requis que pour un reglement par LCR. */
export function isRibRequiredForPaymentType(code: string | null | undefined): boolean {
    return code === PAYMENT_TYPE_LCR
}

/** Vrai si AUCUN champ du bloc RIB n'est rempli (amorce vide a ignorer au submit). */
export function isRibBlank(rib: ProviderRibFormDraft): boolean {
    return ![rib.label, rib.bic, rib.iban].some(isFilled)
}

/** Vrai si les 3 champs du RIB sont remplis (gating « + RIB »). */
export function isRibComplete(rib: ProviderRibFormDraft): boolean {
    return isFilled(rib.label) && isFilled(rib.bic) && isFilled(rib.iban)
}

/**
 * Payload du PATCH comptable (groupe `provider:write:accounting`). Les relations
 * sont en IRI ; la banque n'est envoyee que si elle est requise (RG-3.07), sinon
 * `null` (le back vide la relation hors VIREMENT).
 */
export function buildProviderAccountingPayload(
    accounting: ProviderAccountingDraft,
    isBankRequired: boolean,
): Record<string, unknown> {
    return {
        siren: accounting.siren || null,
        accountNumber: accounting.accountNumber || null,
        tvaMode: accounting.tvaModeIri,
        nTva: accounting.nTva || null,
        paymentDelay: accounting.paymentDelayIri,
        paymentType: accounting.paymentTypeIri,
        bank: isBankRequired ? accounting.bankIri : null,
    }
}

/**
 * Payload d'un RIB (sous-ressource, groupe `provider:write:accounting`). Les
 * champs requis vides sont omis a la creation pour que la 422 NotBlank porte sur
 * le champ.
 */
export function buildProviderRibPayload(rib: ProviderRibFormDraft): Record<string, unknown> {
    const payload: Record<string, unknown> = {
        label: rib.label,
        bic: rib.bic,
        iban: rib.iban,
    }

    for (const key of RIB_REQUIRED_NON_NULLABLE_KEYS) {
        const value = payload[key]
        if (value === null || value === undefined || value === '') {
            delete payload[key]
        }
    }

    return payload
}
