/** * Determina la recomendación de talle según las reglas de negocio. * * @param {Array} tallesUsuarios - Array con los 3 talles de los usuarios (ej: [36, 40, 42]) * @param {number} rangoMinimo - El talle mínimo del rango actual (ej: 38) * @param {number} rangoMaximo - El talle máximo del rango actual (ej: 44) * @param {string} modeloBota - El modelo actual (ej: 'Access', 'Clutch') * @param {boolean} tieneRangoAnterior - Si existe o no un rango más chico en el sistema * @returns {Object} Objeto con la recomendación y el estilo visual correspondiente */ function calcularRecomendacionTalle(tallesUsuarios, rangoMinimo, rangoMaximo, modeloBota, tieneRangoAnterior = true) { // 1. Identificar si hay algún usuario por debajo del mínimo // Buscamos si alguien está exactamente 1 o 2 talles por debajo const talleMenosUno = tallesUsuarios.find(talle => talle === (rangoMinimo - 1)); const talleMenosDos = tallesUsuarios.find(talle => talle === (rangoMinimo - 2)); // 2. Contar cuántos usuarios están PERFECTAMENTE dentro del rango const usuariosDentroDelRango = tallesUsuarios.filter(talle => talle >= rangoMinimo && talle <= rangoMaximo).length; // --- REGLA 1: 2 talles por debajo y los otros 2 adentro --- if (talleMenosDos && usuariosDentroDelRango === 2) { // Excepción: Si es 'Access' y no hay rango menor (ej: rango 2-5) if (modeloBota.toLowerCase() === 'access' && !tieneRangoAnterior) { return { mensaje: El usuario de talle ${talleMenosDos} debería elegir la bota Clutch en ese talle., estilo: { color: 'black', fontWeight: 'normal' } }; } // Comportamiento estándar para 2 talles por debajo return { mensaje: ¡Atención! Se recomienda el rango de talle anterior para el usuario de talle ${talleMenosDos}., estilo: { color: 'red', fontWeight: 'bold' } // Llamada de atención }; } // --- REGLA 2: 1 talle por debajo y los otros 2 adentro --- if (talleMenosUno && usuariosDentroDelRango === 2) { return { mensaje: Para el usuario de talle ${talleMenosUno}, se recomienda utilizar una media 3/4 para lograr un calce más ajustado., estilo: { color: 'black', fontWeight: 'normal' } }; } // --- CASO POR DEFECTO: Todos conformes o no aplica ninguna regla especial --- return { mensaje: "Todos los usuarios están dentro del rango óptimo o no requieren ajustes especiales.", estilo: { color: 'black', fontWeight: 'normal' } }; } // ========================================== // EJEMPLOS DE PRUEBA (TESTS) // ========================================== console.log("--- Prueba 1: 2 talles por debajo (Debería dar ROJO) ---"); const test1 = calcularRecomendacionTalle([36, 40, 42], 38, 44, 'Generic'); console.log(Mensaje: ${test1.mensaje}); console.log(Estilos aplicados:, test1.estilo); console.log("\n--- Prueba 2: Excepción bota Access sin rango menor (Debería sugerir Clutch) ---"); const test2 = calcularRecomendacionTalle([2, 6, 7], 4, 10, 'Access', false); console.log(Mensaje: ${test2.mensaje}); console.log(Estilos aplicados:, test2.estilo); console.log("\n--- Prueba 3: 1 talle por debajo (Debería sugerir media 3/4) ---"); const test3 = calcularRecomendacionTalle([37, 40, 42], 38, 44, 'Access'); console.log(Mensaje: ${test3.mensaje});