/**
 * Types du workflow « Ajouter un transporteur » (M4 Transport, ERP-165 / ERP-166).
 *
 * Périmètre :
 *  - ERP-165 : formulaire PRINCIPAL minimal (Nom + Certification + Affréter).
 *  - ERP-166 : champs CONDITIONNELS du formulaire principal (indexation / benne /
 *    volume si affrété — RG-4.03 ; décharge si AUTRE — RG-4.02 ; immatriculations
 *    LIOT — RG-4.01) + saisie assistée QUALIMAT (copie name / certification /
 *    adresse + FK qualimatCarrier — RG-4.01 / § 2.5).
 *
 * L'upload réel de la décharge (file → IRI via useUpload) arrive à ERP-171 ; ici
 * on porte seulement l'IRI résolu (`dischargeDocumentIri`).
 */

/**
 * Brouillon du formulaire principal. Les décimales (indexation / volume) sont
 * portées en `string` car `MalioInputNumber` émet une chaîne ; le serveur parse.
 * `certificationType` est un code enum back (GMP_PLUS | OVOCOM | COMPTE_PROPRE |
 * AUTRE | QUALIMAT — ce dernier posé par la saisie assistée) ou `null`.
 * `containerType` vaut `BENNE` | `FOND_MOUVANT` (radio) ou `null`.
 */
export interface CarrierMainDraft {
    name: string
    certificationType: string | null
    isChartered: boolean
    indexationRate: string
    containerType: string | null
    volumeM3: string
    liotPlates: string
    /** IRI du document de décharge (résolu par useUpload — ERP-171). */
    dischargeDocumentIri: string | null
    /** IRI de la ligne QUALIMAT liée (saisie assistée — null si non QUALIMAT). */
    qualimatCarrierIri: string | null
}

/** Brouillon principal vide (état initial du formulaire de création). */
export function emptyCarrierMain(): CarrierMainDraft {
    return {
        name: '',
        certificationType: null,
        isChartered: false,
        indexationRate: '',
        // Défaut métier : Benne pré-sélectionné (radio du formulaire principal).
        containerType: 'BENNE',
        volumeM3: '',
        liotPlates: '',
        dischargeDocumentIri: null,
        qualimatCarrierIri: null,
    }
}

/**
 * Adresse copiée depuis le référentiel QUALIMAT à la sélection (RG-4.01 / § 2.5).
 * Stockée dans l'état du formulaire pour alimenter l'onglet Adresses (ticket
 * ultérieur) ; pré-remplie « France » côté pays par défaut.
 */
export interface CarrierAddressCopy {
    country: string
    postalCode: string
    city: string
    street: string
}

/** Adresse copiée vide. */
export function emptyCarrierAddressCopy(): CarrierAddressCopy {
    return { country: 'France', postalCode: '', city: '', street: '' }
}

/**
 * Brouillon d'un bloc Adresse (onglet Adresses, ERP-167) — sous-ressource
 * `CarrierAddress` (groupe `carrier:write:addresses`). Version SIMPLIFIÉE de
 * l'adresse fournisseur (M2) / prestataire (M3) : pas de sites / catégories /
 * contacts ni type d'adresse (les sites du M4 vivent dans l'onglet Prix).
 */
export interface CarrierAddressFormDraft {
    /** Id serveur une fois l'adresse créée (null tant que non persistée). */
    id: number | null
    /** Pays (chaîne libre, défaut « France »). */
    country: string
    postalCode: string | null
    city: string | null
    street: string | null
    streetComplement: string | null
}

/** Brouillon d'adresse vide (pays France par défaut, RG-4.05). */
export function emptyCarrierAddress(): CarrierAddressFormDraft {
    return {
        id: null,
        country: 'France',
        postalCode: null,
        city: null,
        street: null,
        streetComplement: null,
    }
}

/**
 * Brouillon d'un bloc Contact (onglet Contacts, ERP-168) — sous-ressource
 * `CarrierContact` (groupe `carrier:write:contacts`). Les téléphones sont saisis
 * en `phonePrimary` / `phoneSecondary` côté UI, puis envoyés au back sous forme du
 * tableau `phones` (max 2 — RG-4.08). `hasSecondaryPhone` pilote l'affichage du 2e
 * numéro (révélé via le bouton « + »). Pas d'`iri` : aucune relation M2M depuis
 * l'adresse au M4 (≠ M3).
 */
export interface CarrierContactFormDraft {
    /** Id serveur une fois le contact créé (null tant que non persisté). */
    id: number | null
    firstName: string | null
    lastName: string | null
    jobTitle: string | null
    phonePrimary: string | null
    phoneSecondary: string | null
    email: string | null
    /** UI : le 2e numéro a été révélé via le bouton « + » (max 2 téléphones). */
    hasSecondaryPhone: boolean
}

/** Brouillon de contact vide (état initial d'un bloc Contact). */
export function emptyCarrierContact(): CarrierContactFormDraft {
    return {
        id: null,
        firstName: null,
        lastName: null,
        jobTitle: null,
        phonePrimary: null,
        phoneSecondary: null,
        email: null,
        hasSecondaryPhone: false,
    }
}

/**
 * Brouillon d'un bloc Prix (onglet Prix, ERP-169 — RG-4.09→4.11). `direction`
 * pilote la branche active : CLIENT (client + adresse de livraison + site de
 * départ) ou FOURNISSEUR (fournisseur + adresse d'appro + site de livraison). Les
 * relations partent au back en IRI (string). `price` est une chaîne (MalioInputAmount).
 */
export interface CarrierPriceFormDraft {
    id: number | null
    direction: 'CLIENT' | 'FOURNISSEUR' | null
    // Branche CLIENT (RG-4.10).
    clientIri: string | null
    clientDeliveryAddressIri: string | null
    departureSiteIri: string | null
    // Branche FOURNISSEUR (RG-4.11).
    supplierIri: string | null
    supplierSupplyAddressIri: string | null
    deliverySiteIri: string | null
    // Communs (toujours requis).
    containerType: string | null
    pricingUnit: string | null
    price: string | null
    priceState: string | null
}

/** Brouillon de prix vide (état initial d'un bloc Prix : tout masqué tant que direction null). */
export function emptyCarrierPrice(): CarrierPriceFormDraft {
    return {
        id: null,
        // Défaut métier : sens CLIENT pré-sélectionné (un bloc prix CLIENT est présent
        // d'office à l'ouverture de l'onglet).
        direction: 'CLIENT',
        clientIri: null,
        clientDeliveryAddressIri: null,
        departureSiteIri: null,
        supplierIri: null,
        supplierSupplyAddressIri: null,
        deliverySiteIri: null,
        // Défauts métier : Benne + Forfait pré-sélectionnés à l'ajout d'un bloc prix.
        containerType: 'BENNE',
        pricingUnit: 'FORFAIT',
        price: null,
        priceState: null,
    }
}

/**
 * Réponse du POST / PATCH principal (groupe `carrier:read`). Le serveur renvoie
 * le nom normalisé (UPPERCASE, RG-4.13) que l'UI réaffiche tel quel.
 */
export interface CarrierMainResponse {
    id: number
    name: string | null
    certificationType: string | null
    '@id'?: string
}
