/**
 * Import du « fichier des paiements » dans la retenue à la source — types.
 *
 * Miroir EXACT du contrat back ↔ front (routes `retenue.import_sheet.*`, toutes
 * en JSON). Rien n'est recalculé côté écran : les montants, les statuts et les
 * motifs arrivent rédigés par le serveur, qui RELIT le fichier à chaque appel.
 *
 * ⚠️ Jamais le nom d'un prestataire à l'écran : on dit « le fichier des
 * paiements », « lien du fichier ».
 */

/** Prop Inertia `import_sheet` de la page `retenue/index`. */
export interface ImportSheetProps {
    /** Compte principal ET permission `retenue.create`. */
    disponible: boolean;
    /** Compte principal ET permission `retenue_cloture.declare`. */
    peut_envoyer: boolean;
    /** Lignes importées du fichier, encore déposables (jamais parties, ou à refaire). */
    lignes_a_envoyer: number;
}

/** Le fichier lu. */
export interface FichierPaiements {
    id: string;
    titre: string;
    url: string;
}

/** Un onglet du fichier — un mois, en pratique. */
export interface OngletFichier {
    gid: number;
    titre: string;
    /** Le serveur sait lire cet onglet (colonnes reconnues). */
    reconnu: boolean;
    /** Pourquoi il ne l'est pas — `null` quand il l'est. */
    motif: string | null;
}

/** Une ligne du fichier liée à une ligne du manager, que le serveur ne retrouve plus. */
export interface LigneIntrouvable {
    ligne_id: number;
    onglet: string;
    numero: number;
    nom: string;
}

/** Le suivi des couleurs posées dans le fichier. */
export interface SuiviFichier {
    /** Lignes du fichier liées à une ligne du manager. */
    total: number;
    /** Couleur voulue ≠ couleur posée. */
    en_attente: number;
    introuvables: LigneIntrouvable[];
    derniere_erreur: string | null;
}

/** GET `retenue.import_sheet.etat`. */
export interface EtatImport {
    /** Le compte de service est présent et lisible. */
    configure: boolean;
    /** Pourquoi rien n'est lisible (FR) — `null` quand tout va bien. */
    message: string | null;
    /** E-mail à qui partager le fichier, en Éditeur. */
    compte_service: string | null;
    /** `null` si non configuré ou illisible (`message` dit pourquoi). */
    spreadsheet: FichierPaiements | null;
    onglets: OngletFichier[];
    suivi: SuiviFichier;
}

export type StatutLigne = 'a_importer' | 'avertissement' | 'bloquee' | 'deja_faite' | 'ignoree';

export type TypeIdentifiant = 'cin' | 'mf';

/** Le bénéficiaire reconnu dans le manager. */
export interface BeneficiaireApercu {
    id: number | null;
    nom: string;
    /** Fiche fiscale complète pour un dépôt. */
    complet: boolean;
    /** Ce qui manque à la fiche (FR, déjà rédigé). */
    manque: string[];
}

/** Une ligne de l'aperçu. */
export interface LigneApercu {
    /** Opaque — renvoyée telle quelle à `confirmer`. */
    cle: string;
    /** N° de ligne dans le fichier (1 = première ligne). */
    numero: number;
    nom_fichier: string;
    logement: string | null;
    /** CIN 8 chiffres ou M/F 7 chiffres + lettre, normalisé. */
    identifiant: string | null;
    type_identifiant: TypeIdentifiant | null;
    montant_brut: number | null;
    retenue_fichier: number | null;
    /** Ce que le manager déclarera (10 %, tronqué au millime). */
    retenue_calculee: number | null;
    /** `Y-m-d`. */
    date_paiement: string | null;
    statut: StatutLigne;
    /** FR, déjà rédigés pour l'écran. */
    motifs: string[];
    beneficiaire: BeneficiaireApercu | null;
    /** Ligne existante du manager (déjà faite, ou à lier). */
    ligne_manager: { id: number; reference: string | null } | null;
}

/** D'où vient la date appliquée aux lignes sans date propre. */
export type SourceDate = 'entete' | 'colonne' | 'forcee';

export interface OngletApercu {
    gid: number;
    titre: string;
    /** `Y-m-d` appliquée aux lignes sans date propre. */
    date_onglet: string | null;
    date_source: SourceDate | null;
    /** `YYYY-MM` de `date_onglet`. */
    mois: string | null;
    lignes: LigneApercu[];
}

export interface CompteursApercu {
    a_importer: number;
    avertissement: number;
    bloquee: number;
    deja_faite: number;
    ignoree: number;
}

/** POST `retenue.import_sheet.apercu` — aucune écriture. */
export interface Apercu {
    spreadsheet: FichierPaiements;
    onglets: OngletApercu[];
    compteurs: CompteursApercu;
}

/** POST `retenue.import_sheet.confirmer`. */
export interface ResultatImport {
    creees: number;
    liees: number;
    refusees: Array<{ cle: string; motif: string }>;
    /** Ids des lignes créées ou liées. */
    lignes: number[];
    /** Marquage dans le fichier (repère de ligne / couleurs). */
    fichier: { ok: boolean; message: string | null };
}

export type ActeDepot = 'initial' | 'rectificatif';

/** Une ligne déposable. */
export interface LigneAEnvoyer {
    id: number;
    declaration_id: number;
    /** `YYYY-MM`. */
    mois: string;
    reference: string | null;
    beneficiaire_nom: string;
    identifiant: string | null;
    montant_brut: number;
    montant_retenue: number;
    date_paiement: string | null;
    acte: ActeDepot;
}

/** Une ligne importée qui ne peut pas partir (fiche incomplète…). */
export interface LigneBloquee {
    id: number;
    beneficiaire_nom: string;
    mois: string;
    motifs: string[];
}

/** GET `retenue.import_sheet.a_envoyer`. */
export interface AEnvoyer {
    lignes: LigneAEnvoyer[];
    bloquees: LigneBloquee[];
}

/** POST `retenue.import_sheet.lots.store`. */
export interface LotCree {
    lot: string;
    /** ISO 8601. */
    expire_a: string;
    lignes: number[];
}

/** POST `retenue.import_sheet.lots.deposer` — 200. */
export interface DepotReussi {
    ok: true;
    message: string;
    reference: string | null;
    detail: string | null;
}

/** POST `retenue.import_sheet.lots.deposer` — 422 (ou échec réseau, reconstitué ici). */
export interface DepotEchoue {
    ok: false;
    message: string;
    code: string | null;
}

export type ResultatDepot = DepotReussi | DepotEchoue;

/** POST `retenue.import_sheet.couleurs`. */
export interface ResultatCouleurs {
    ok: boolean;
    colorees: number;
    introuvables: number;
    message: string;
}
