import type { RegleDePaiement } from './types';

/**
 * Logique PURE de l'étape « Règles de paiement » (TL-301) : calcul des exemples
 * chiffrés et lecture du pourcentage saisi. Isolée du composant pour être
 * testée (`payment-rules-utils.test.ts`).
 *
 * `montantGarde` est le miroir de App\Services\Factures\RegleDePaiement::calculer()
 * — même formule, mêmes valeurs par défaut. Si l'une change, l'autre aussi.
 */

/** Montant des exemples : un versement de 1 000 $US. */
export const MONTANT_EXEMPLE = 1000;

/** RegleDePaiement::POURCENTAGE_DEFAUT */
export const POURCENTAGE_DEFAUT = 100;

const montantFmt = new Intl.NumberFormat('fr-FR', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
const tauxFmt = new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 2 });

export const formatUsd = (valeur: number): string => `${montantFmt.format(valeur)} $US`;
export const formatTnd = (valeur: number): string => `${montantFmt.format(valeur)} TND`;
export const formatPourcent = (valeur: number): string => `${tauxFmt.format(valeur)} %`;

/** Remplace les jetons `:nom` d'un texte de langue ; un jeton inconnu reste tel quel. */
export function remplir(modele: string, valeurs: Record<string, string>): string {
    return modele.replace(/:([a-z_]+)/g, (jeton: string, nom: string) => valeurs[nom] ?? jeton);
}

/**
 * Pourcentage saisi, ou null s'il n'est pas un nombre entre 0 et 100 à deux
 * décimales au plus — les mêmes bornes que PaymentRuleRequest. La virgule
 * française est acceptée.
 */
export function lirePourcentage(saisie: string): number | null {
    const texte = saisie.trim().replace(',', '.');
    if (texte === '' || !/^\d+(\.\d{1,2})?$/.test(texte)) return null;
    const valeur = Number(texte);
    return valeur >= 0 && valeur <= 100 ? valeur : null;
}

/** Montant TTC gardé par The Landlord, non arrondi (RegleDePaiement::calculer). */
export function montantGarde(regle: RegleDePaiement, montant: number, menage: number, commissionPct: number, pct: number): number {
    switch (regle) {
        case 'menage':
            return menage;
        case 'pourcentage':
            return (montant * pct) / 100;
        default:
            return menage + ((montant - menage) * commissionPct) / 100;
    }
}
