/**
 * Fichier  : assets/js/utils.js
 * Auteur   : KREMER Régis
 * Version  : 2.6.70
 * Date     : 2026-07-11
 * Description : JS — Utilitaires partagés : getBaseCost, formatDate, formatCurrency
 *
 * Changelog :
 *   v2.1.0 (2026-02-21) — Version initiale auditée et sécurisée
 *   v2.1.1 (2026-02-21) — Corrections sécurité, utils.js centralisé
 *   v2.2.0 (2026-02-21) — Permissions magasins, bons de commande, rapport d'écart,
 *                      import CSV, historique prix, bon de livraison multi-lignes
 *   v2.6.70 (2026-07-11) — I18N CORE LOCALE CURRENCY1 : formatage partagé via Intl et devise configurée.
 */
// ================================================================
// utils.js — Shared utility functions for MageStock
// ================================================================

/**
 * Calcule le coût par unité de BASE pour un produit.
 * Fonction partagée utilisée par dashboard.js, reports.js, products.js
 * 
 * @param {Object} p - Product object
 * @returns {number} Cost per base unit
 */
function getBaseCost(p) {
    if (!p) return 0;

    const cost = parseFloat(p?.cost || 0);
    const cump = parseFloat(p?.cump || 0);
    const baseUnit = (p?.packBaseUnit || p?.unitType || 'piece').trim() || 'piece';

    const packBidonQty = parseFloat(p?.packBidonQty || 0);
    const packFutQty = parseFloat(p?.packFutQty || 0);

    // Prefer costByUnit map for base unit if set
    const costByUnit = p?.costByUnit;
    if (costByUnit && typeof costByUnit === 'object' && !Array.isArray(costByUnit)) {
        const baseCost = parseFloat(costByUnit[baseUnit] || 0);
        if (baseCost > 0) return baseCost;
    }

    // If bidon/fût packaging defined, cost is per container — divide by content
    if (packBidonQty > 1 && (baseUnit === 'kg' || baseUnit === 'litre')) {
        const prixConditionnement = cump > 0 ? cump : cost;
        if (prixConditionnement > 0) return prixConditionnement / packBidonQty;
    }
    if (packFutQty > 1 && (baseUnit === 'kg' || baseUnit === 'litre')) {
        const prixConditionnement = cump > 0 ? cump : cost;
        if (prixConditionnement > 0) return prixConditionnement / packFutQty;
    }

    // Default: cump or cost is already per base unit
    if (cump > 0) return cump;
    return cost;
}

/**
 * Format a number as currency string
 * @param {number} val
 * @param {number} decimals
 * @returns {string}
 */
function formatCurrency(val, decimals = 2) {
    if (window.Locale) {
        return window.Locale.formatMoney(val, {
            minimumFractionDigits: decimals,
            maximumFractionDigits: decimals
        });
    }
    return Number(val || 0).toFixed(decimals) + ' EUR';
}

/**
 * Format a date string to French locale
 * @param {string} dateStr ISO date string
 * @returns {string}
 */
function formatDate(dateStr) {
    if (!dateStr) return '—';
    return window.Locale
        ? window.Locale.formatDate(dateStr, {day:'2-digit', month:'short', year:'numeric'})
        : new Date(dateStr).toLocaleDateString();
}

/**
 * Format a datetime string to French locale
 * @param {string} dateStr ISO date string
 * @returns {string}
 */
function formatDateTime(dateStr) {
    if (!dateStr) return '—';
    return window.Locale
        ? window.Locale.formatDateTime(dateStr, {day:'2-digit', month:'short', year:'numeric', hour:'2-digit', minute:'2-digit'})
        : new Date(dateStr).toLocaleString();
}
