package dev.lions.btpxpress.converter;

import jakarta.faces.component.UIComponent;
import jakarta.faces.context.FacesContext;
import jakarta.faces.convert.Converter;
import jakarta.faces.convert.FacesConverter;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;

/**
 * Converter personnalisé pour formater les montants en Franc CFA (Fcfa).
 * 
 * <p>Ce converter formate les nombres avec des espaces comme séparateurs de milliers
 * au lieu de virgules, conformément au format standard du Franc CFA.</p>
 * 
 * <p>Exemple : 1234567 devient "1 234 567 Fcfa"</p>
 * 
 * @author BTP Xpress Team
 * @version 1.0
 */
@FacesConverter("fcfaConverter")
public class FcfaConverter implements Converter<Number> {

    private static final DecimalFormatSymbols SYMBOLS;
    
    static {
        SYMBOLS = new DecimalFormatSymbols(Locale.FRENCH);
        SYMBOLS.setGroupingSeparator(' ');
        SYMBOLS.setDecimalSeparator(',');
    }

    /**
     * Convertit une chaîne de caractères en nombre.
     * 
     * @param context Le contexte Faces
     * @param component Le composant UI
     * @param value La valeur string à convertir
     * @return Le nombre converti, ou null si la valeur est vide/null
     */
    @Override
    public Number getAsObject(FacesContext context, UIComponent component, String value) {
        if (value == null || value.trim().isEmpty()) {
            return null;
        }
        
        try {
            // Retirer les espaces et le préfixe "Fcfa" si présent
            String cleanedValue = value.replaceAll("\\s+", "")
                                        .replace("Fcfa", "")
                                        .replace("fcfa", "")
                                        .trim();
            
            return new BigDecimal(cleanedValue);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("Impossible de convertir '" + value + "' en nombre", e);
        }
    }

    /**
     * Convertit un nombre en chaîne de caractères formatée.
     * 
     * @param context Le contexte Faces
     * @param component Le composant UI
     * @param value Le nombre à convertir
     * @return La chaîne formatée avec espaces comme séparateurs de milliers
     */
    @Override
    public String getAsString(FacesContext context, UIComponent component, Number value) {
        if (value == null) {
            return "";
        }
        
        // Formater avec espaces comme séparateurs de milliers (format Fcfa standard)
        // Le pattern "#" avec groupingUsed=true utilise le groupingSeparator défini dans SYMBOLS (espace)
        DecimalFormat formatter = new DecimalFormat("#", SYMBOLS);
        formatter.setGroupingSize(3);
        formatter.setGroupingUsed(true);
        formatter.setMaximumFractionDigits(0);
        
        long amount = value.longValue();
        return formatter.format(amount);
    }
}

