/**
 * Types « brouillon » de l'ecran « Ajouter un prestataire » (M3 Technique).
 *
 * Miroir reduit de `types/supplierForm.ts` (M2) : le M3 n'a PAS d'onglet
 * Information, et porte en plus un selecteur de site SUR le formulaire principal
 * (RG-3.03 — relation directe `provider.sites`, distincte des sites d'adresse).
 *
 * Ces interfaces decrivent l'etat LOCAL du formulaire (refs Vue), distinct des
 * DTO de l'API : la page de creation (ERP-141) et — a venir — les blocs d'onglet
 * Contact / Adresse / Comptabilite (ERP-142 → 144) les partagent.
 *
 * Les relations M2M (categories, sites) sont portees par leurs IRI Hydra (`@id`),
 * envoyees telles quelles dans le payload POST (cf. contrat back ERP-139 :
 * `categories: ['/api/categories/{id}']`, `sites: ['/api/sites/{id}']`).
 */

/** Etat « plat » du formulaire principal (groupe `provider:write:main`). */
export interface ProviderMainDraft {
    /** Nom de l'entreprise prestataire. UPPERCASE serveur (RG-3.11), unicite RG-3.10. */
    companyName: string | null
    /** IRI des categories rattachees (M2M, type PRESTATAIRE — RG-3.09 ; >= 1). */
    categoryIris: string[]
    /** IRI des sites rattaches DIRECTEMENT au prestataire (M2M `provider_site`, RG-3.03 ; >= 1). */
    siteIris: string[]
}

/** Fabrique un formulaire principal vierge. */
export function emptyProviderMain(): ProviderMainDraft {
    return {
        companyName: null,
        categoryIris: [],
        siteIris: [],
    }
}

/** Reponse minimale du POST /providers exploitee par l'ecran de creation. */
export interface ProviderMainResponse {
    id: number
    /** Nom renvoye normalise (UPPERCASE) par le serveur, reaffiche en lecture seule. */
    companyName: string | null
}

/**
 * Un contact du prestataire (onglet Contact, ERP-142). Miroir de
 * `SupplierContactFormDraft` (M2). Tous les champs sont nullable cote ORM ; la
 * validite (RG-3.04) tient a la presence d'AU MOINS un champ rempli parmi
 * prenom / nom / fonction / telephone principal / email (cf. back).
 */
export interface ProviderContactFormDraft {
    /** Id serveur une fois le contact cree (null tant que non persiste). */
    id: number | null
    /** IRI Hydra du contact cree — servira au rattachement M2M cote adresse (ERP-143). */
    iri: string | null
    firstName: string | null
    lastName: string | null
    jobTitle: string | null
    phonePrimary: string | null
    phoneSecondary: string | null
    email: string | null
    /** UI : le 2e numero a ete revele via le bouton « + » (max 2 telephones). */
    hasSecondaryPhone: boolean
}

/** Fabrique un contact vierge. */
export function emptyProviderContact(): ProviderContactFormDraft {
    return {
        id: null,
        iri: null,
        firstName: null,
        lastName: null,
        jobTitle: null,
        phonePrimary: null,
        phoneSecondary: null,
        email: null,
        hasSecondaryPhone: false,
    }
}

/** Reponse du POST /providers/{id}/contacts (groupe provider:item:read + IRI Hydra). */
export interface ProviderContactResponse {
    '@id'?: string
    id: number
}

/**
 * Une adresse du prestataire (onglet Adresse, ERP-143). Version SIMPLIFIEE de
 * `SupplierAddressFormDraft` (M2) : PAS de type d'adresse (Prospect/Depart/Rendu),
 * PAS de bennes, PAS de prestation de triage. Champs postaux + M2M sites /
 * categories / contacts (par IRI).
 */
export interface ProviderAddressFormDraft {
    /** Id serveur une fois l'adresse creee (null tant que non persistee). */
    id: number | null
    /** Pays (chaine libre, defaut « France »). */
    country: string
    postalCode: string | null
    city: string | null
    street: string | null
    streetComplement: string | null
    /** IRI des categories rattachees (type PRESTATAIRE, RG-3.09 ; >= 1). */
    categoryIris: string[]
    /** IRI des sites rattaches a l'adresse (M2M `provider_address_site`, RG-3.05 ; >= 1). */
    siteIris: string[]
    /** IRI des contacts rattaches (= blocs Contact deja persistes de l'onglet Contact). */
    contactIris: string[]
}

/** Fabrique une adresse vierge (France presaisi). */
export function emptyProviderAddress(): ProviderAddressFormDraft {
    return {
        id: null,
        country: 'France',
        postalCode: null,
        city: null,
        street: null,
        streetComplement: null,
        categoryIris: [],
        siteIris: [],
        contactIris: [],
    }
}

/** Reponse du POST /providers/{id}/addresses (id suffisant pour le suivi cote front). */
export interface ProviderAddressResponse {
    id: number
}

/**
 * Etat « plat » de l'onglet Comptabilite (groupe `provider:write:accounting`).
 * Relations (TVA / delai / type de reglement / banque) portees par leur IRI.
 */
export interface ProviderAccountingDraft {
    siren: string | null
    accountNumber: string | null
    tvaModeIri: string | null
    nTva: string | null
    paymentDelayIri: string | null
    paymentTypeIri: string | null
    /** Banque : requise et envoyee uniquement si Type de reglement = VIREMENT (RG-3.07). */
    bankIri: string | null
}

/** Fabrique un onglet Comptabilite vierge. */
export function emptyProviderAccounting(): ProviderAccountingDraft {
    return {
        siren: null,
        accountNumber: null,
        tvaModeIri: null,
        nTva: null,
        paymentDelayIri: null,
        paymentTypeIri: null,
        bankIri: null,
    }
}

/** Un RIB du prestataire (sous-collection comptable, obligatoire si Type = LCR — RG-3.08). */
export interface ProviderRibFormDraft {
    id: number | null
    label: string | null
    bic: string | null
    iban: string | null
}

/** Fabrique un RIB vierge. */
export function emptyProviderRib(): ProviderRibFormDraft {
    return {
        id: null,
        label: null,
        bic: null,
        iban: null,
    }
}

/** Reponse du POST /providers/{id}/ribs (id suffisant pour le suivi cote front). */
export interface ProviderRibResponse {
    id: number
}
