import type { Devise, FactureListe, FactureStatut, FactureType } from './types';

/**
 * Formatage du module Factures. Affichage seulement : aucun montant n'est
 * calculé ici, ils viennent tous du serveur.
 */

const DECIMALES: Record<Devise, number> = { TND: 3, EUR: 2, USD: 2 };
const SYMBOLES: Record<Devise, string> = { TND: 'TND', EUR: '€', USD: '$US' };

export const decimales = (devise: Devise) => DECIMALES[devise] ?? 3;

/** « 2 667,54 $US » · « 1 610,000 TND ». */
export function fmtMontant(valeur: number, devise: Devise): string {
    const d = decimales(devise);
    const n = valeur.toLocaleString('fr-FR', { minimumFractionDigits: d, maximumFractionDigits: d });
    return `${n}\u00a0${SYMBOLES[devise] ?? devise}`;
}

/** Nombre saisi, sans devise : « 899,26 ». */
export function fmtNombre(valeur: number, d = 2): string {
    return valeur.toLocaleString('fr-FR', { minimumFractionDigits: 0, maximumFractionDigits: d });
}

/** Lecture tolérante d'une saisie : « 1 234,5 » → 1234.5 ; vide ou invalide → 0. */
export function lireNombre(saisie: string): number {
    const n = Number.parseFloat(saisie.replace(/[\s\u00a0\u202f]/g, '').replace(',', '.'));
    return Number.isFinite(n) ? n : 0;
}

/** ISO `YYYY-MM-DD` → `jj/mm/aaaa`. */
export function fmtDate(iso: string | null | undefined): string {
    if (!iso) return '';
    const m = /^(\d{4})-(\d{2})-(\d{2})/.exec(iso);
    return m ? `${m[3]}/${m[2]}/${m[1]}` : iso;
}

/** ISO datetime → `jj/mm/aaaa à hh:mm`. */
export function fmtDateHeure(iso: string | null | undefined): string {
    if (!iso) return '';
    const d = new Date(iso);
    if (Number.isNaN(d.getTime())) return iso;
    const p = (n: number) => String(n).padStart(2, '0');
    return `${p(d.getDate())}/${p(d.getMonth() + 1)}/${d.getFullYear()} à ${p(d.getHours())}:${p(d.getMinutes())}`;
}

export const TYPE_LIBELLE: Record<FactureType, string> = {
    facture: 'Facture',
    proforma: 'Proforma',
    avoir: 'Avoir',
};

/**
 * Statut AFFICHÉ — « En retard » n'est pas un statut enregistré : c'est une
 * facture émise dont l'échéance est passée (calculé par le serveur).
 */
export type StatutAffiche = FactureStatut | 'en_retard';

export function statutAffiche(f: Pick<FactureListe, 'statut' | 'en_retard'>): StatutAffiche {
    return f.en_retard ? 'en_retard' : f.statut;
}

export const STATUT_LIBELLE: Record<StatutAffiche, string> = {
    brouillon: 'Brouillon',
    emise: 'Non payée',
    payee: 'Payée',
    annulee: 'Annulée',
    convertie: 'Convertie',
    en_retard: 'En retard',
};

/**
 * Couleur = sens : gris = pas encore/plus actif, ambre = en attente,
 * rouge = échéance dépassée, vert = encaissée. La légende de la liste le dit.
 */
export const STATUT_CLASSES: Record<StatutAffiche, string> = {
    brouillon: 'bg-slate-100 text-slate-700 ring-slate-200',
    emise: 'bg-amber-50 text-amber-800 ring-amber-200',
    payee: 'bg-emerald-50 text-emerald-800 ring-emerald-200',
    annulee: 'bg-slate-100 text-slate-500 ring-slate-200 line-through',
    convertie: 'bg-slate-100 text-slate-600 ring-slate-200',
    en_retard: 'bg-rose-50 text-rose-800 ring-rose-200',
};
