/**
 * Utilidades para formateo de datos
 * Centraliza funciones de formato comunes usadas en todo el proyecto
 */

/**
 * Formatea un número como moneda en pesos mexicanos
 * @param {Number|String} amount - Cantidad a formatear
 * @returns {String} - Cantidad formateada con símbolo de moneda
 * @example
 * formatCurrency(1234.56) // "$1,234.56"
 * formatCurrency("1234.56") // "$1,234.56"
 * formatCurrency(null) // "$0.00"
 */
export const formatCurrency = (amount) => {
    return new Intl.NumberFormat('es-MX', {
        style: 'currency',
        currency: 'MXN'
    }).format(amount || 0);
};

/**
 * Formatea un número como moneda simple (solo el número con 2 decimales)
 * @param {Number|String} amount - Cantidad a formatear
 * @returns {String} - Cantidad formateada sin símbolo de moneda
 * @example
 * formatMoney(1234.56) // "1234.56"
 * formatMoney("1234.567") // "1234.57"
 * formatMoney(null) // "0.00"
 */
export const formatMoney = (amount) => {
    return new Intl.NumberFormat('es-MX', {
        minimumFractionDigits: 2,
        maximumFractionDigits: 2
    }).format(amount || 0);
};

/**
 * Parsea un valor a número flotante de forma segura
 * @param {Number|String} value - Valor a parsear
 * @param {Number} defaultValue - Valor por defecto si el parseo falla
 * @returns {Number} - Número parseado o valor por defecto
 * @example
 * safeParseFloat("123.45") // 123.45
 * safeParseFloat(null) // 0
 * safeParseFloat("invalid", 10) // 10
 */
export const safeParseFloat = (value, defaultValue = 0) => {
    const parsed = parseFloat(value);
    return isNaN(parsed) ? defaultValue : parsed;
};

/**
 * Formatea una fecha en formato legible en español
 * @param {String|Date} dateString - Fecha a formatear
 * @param {Object} options - Opciones de formato
 * @returns {String} - Fecha formateada
 * @example
 * formatDate("2024-01-15T10:30:00") // "15 de enero de 2024"
 * formatDate("2024-01-15T10:30:00", { includeTime: true }) // "15 de enero de 2024, 10:30"
 */
export const formatDate = (dateString, options = {}) => {
    if (!dateString) return '-';

    const date = new Date(dateString);
    const {
        includeTime = false,
        shortMonth = false,
        shortDate = false
    } = options;

    if (shortDate) {
        // Formato corto: 15/01/2024
        return new Intl.DateTimeFormat('es-MX', {
            year: 'numeric',
            month: '2-digit',
            day: '2-digit'
        }).format(date);
    }

    const dateOptions = {
        year: 'numeric',
        month: shortMonth ? '2-digit' : 'long',
        day: 'numeric'
    };

    if (includeTime) {
        dateOptions.hour = '2-digit';
        dateOptions.minute = '2-digit';
    }

    return new Intl.DateTimeFormat('es-MX', dateOptions).format(date);
};

/**
 * Formatea solo la hora de una fecha
 * @param {String|Date} dateString - Fecha de la cual extraer la hora
 * @param {Boolean} includeSeconds - Si incluir segundos
 * @returns {String} - Hora formateada
 * @example
 * formatTime("2024-01-15T10:30:45") // "10:30"
 * formatTime("2024-01-15T10:30:45", true) // "10:30:45"
 */
export const formatTime = (dateString, includeSeconds = false) => {
    if (!dateString) return '-';

    const date = new Date(dateString);
    const options = {
        hour: '2-digit',
        minute: '2-digit'
    };

    if (includeSeconds) {
        options.second = '2-digit';
    }

    return new Intl.DateTimeFormat('es-MX', options).format(date);
};

/**
 * Formatea un número como porcentaje
 * @param {Number|String} value - Valor a formatear
 * @param {Number} decimals - Número de decimales
 * @returns {String} - Porcentaje formateado
 * @example
 * formatPercent(0.16) // "16.00%"
 * formatPercent(16, 0) // "16%"
 */
export const formatPercent = (value, decimals = 2) => {
    const number = parseFloat(value || 0);
    return `${number.toFixed(decimals)}%`;
};

/**
 * Mapeo de métodos de pago a sus etiquetas en español
 */
export const PAYMENT_METHODS = {
    cash: 'Efectivo',
    credit_card: 'Tarjeta de Crédito',
    debit_card: 'Tarjeta de Débito',
    transfer: 'Transferencia',
    other: 'Otro'
};

/**
 * Obtener la etiqueta de un método de pago
 * @param {String} method - Código del método de pago
 * @returns {String} - Etiqueta en español
 */
export const getPaymentMethodLabel = (method) => {
    return PAYMENT_METHODS[method] || method;
};
