/**
 * Utilitaires de formatage pour l'application BTP Xpress
 */

/**
 * Formate un montant en devise avec le symbole Euro
 * @param amount - Le montant à formater
 * @param currency - La devise (par défaut EUR)
 * @returns Le montant formaté avec le symbole de devise
 */
export const formatCurrency = (amount: number, currency: string = 'EUR'): string => {
    return new Intl.NumberFormat('fr-FR', {
        style: 'currency',
        currency: currency,
        minimumFractionDigits: 2,
        maximumFractionDigits: 2
    }).format(amount);
};

/**
 * Formate un nombre avec des séparateurs de milliers
 * @param value - Le nombre à formater
 * @returns Le nombre formaté avec séparateurs
 */
export const formatNumber = (value: number): string => {
    return new Intl.NumberFormat('fr-FR').format(value);
};

/**
 * Formate une date en français
 * @param date - La date à formater
 * @param options - Options de formatage
 * @returns La date formatée
 */
export const formatDate = (date: string | Date, options?: Intl.DateTimeFormatOptions): string => {
    const dateObj = typeof date === 'string' ? new Date(date) : date;
    
    const defaultOptions: Intl.DateTimeFormatOptions = {
        day: '2-digit',
        month: '2-digit',
        year: 'numeric'
    };
    
    return new Intl.DateTimeFormat('fr-FR', options || defaultOptions).format(dateObj);
};

/**
 * Formate une date et heure en français
 * @param datetime - La date/heure à formater
 * @returns La date/heure formatée
 */
export const formatDateTime = (datetime: string | Date): string => {
    const dateObj = typeof datetime === 'string' ? new Date(datetime) : datetime;
    
    return new Intl.DateTimeFormat('fr-FR', {
        day: '2-digit',
        month: '2-digit',
        year: 'numeric',
        hour: '2-digit',
        minute: '2-digit'
    }).format(dateObj);
};

/**
 * Formate un pourcentage
 * @param value - La valeur à formater (entre 0 et 1 ou 0 et 100)
 * @param isDecimal - Si true, la valeur est entre 0 et 1, sinon entre 0 et 100
 * @returns Le pourcentage formaté
 */
export const formatPercentage = (value: number, isDecimal: boolean = false): string => {
    const percentage = isDecimal ? value * 100 : value;
    return new Intl.NumberFormat('fr-FR', {
        style: 'percent',
        minimumFractionDigits: 0,
        maximumFractionDigits: 2
    }).format(isDecimal ? value : value / 100);
};

/**
 * Formate une durée en jours
 * @param days - Le nombre de jours
 * @returns La durée formatée
 */
export const formatDuration = (days: number): string => {
    if (days === 0) return 'Aujourd\'hui';
    if (days === 1) return '1 jour';
    if (days === -1) return 'Il y a 1 jour';
    if (days > 0) return `${days} jours`;
    return `Il y a ${Math.abs(days)} jour${Math.abs(days) > 1 ? 's' : ''}`;
};

/**
 * Formate la taille d'un fichier
 * @param bytes - La taille en bytes
 * @returns La taille formatée
 */
export const formatFileSize = (bytes: number): string => {
    const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
    if (bytes === 0) return '0 B';
    
    const i = Math.floor(Math.log(bytes) / Math.log(1024));
    return Math.round(bytes / Math.pow(1024, i) * 100) / 100 + ' ' + sizes[i];
};

/**
 * Formate un nom complet à partir du prénom et nom
 * @param prenom - Le prénom
 * @param nom - Le nom
 * @returns Le nom complet formaté
 */
export const formatFullName = (prenom: string, nom: string): string => {
    return `${prenom} ${nom}`.trim();
};

/**
 * Formate une adresse complète
 * @param adresse - L'adresse
 * @param codePostal - Le code postal
 * @param ville - La ville
 * @returns L'adresse complète formatée
 */
export const formatAddress = (adresse?: string, codePostal?: string, ville?: string): string => {
    const parts = [adresse, codePostal, ville].filter(part => part && part.trim());
    return parts.join(', ');
};

/**
 * Formate un numéro de téléphone français
 * @param telephone - Le numéro de téléphone
 * @returns Le numéro formaté
 */
export const formatPhoneNumber = (telephone: string): string => {
    // Supprime tous les caractères non numériques
    const cleaned = telephone.replace(/\D/g, '');
    
    // Vérifie si c'est un numéro français (10 chiffres)
    if (cleaned.length === 10) {
        return cleaned.replace(/(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, '$1 $2 $3 $4 $5');
    }
    
    // Retourne le numéro tel quel si ce n'est pas un format français standard
    return telephone;
};

/**
 * Tronque un texte à une longueur donnée
 * @param text - Le texte à tronquer
 * @param maxLength - La longueur maximale
 * @returns Le texte tronqué
 */
export const truncateText = (text: string, maxLength: number): string => {
    if (text.length <= maxLength) return text;
    return text.substring(0, maxLength - 3) + '...';
};

/**
 * Capitalise la première lettre d'une chaîne
 * @param str - La chaîne à capitaliser
 * @returns La chaîne capitalisée
 */
export const capitalize = (str: string): string => {
    if (!str) return '';
    return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
};

/**
 * Formate un statut pour l'affichage
 * @param status - Le statut brut
 * @returns Le statut formaté
 */
export const formatStatus = (status: string): string => {
    return status
        .split('_')
        .map(word => capitalize(word))
        .join(' ');
};