import { BASE_DAILY_TARGETS, LEVEL1_NUTRITION_KEYS, LEVEL2_NUTRITION_KEYS, LEVEL3_NUTRITION_KEYS, NUTRIENT_META, USA_GOV_DGA_KEYS, } from '@/common/constants/nutrition'; import { NutrientKey, Nutrition, NutritionDisplayMode, NutritionSortMode } from '@/types/nutrition'; export type NutrientsByLevel = { level1: NutrientKey[]; level2: NutrientKey[]; level3: NutrientKey[]; }; export function getNutrientsByMode(mode: NutritionDisplayMode): NutrientsByLevel { if (mode === 'usa_gov_dga') { return { level1: USA_GOV_DGA_KEYS, level2: [], level3: [] }; } return { level1: LEVEL1_NUTRITION_KEYS, level2: LEVEL2_NUTRITION_KEYS, level3: LEVEL3_NUTRITION_KEYS, }; } export function sortNutrients( keys: NutrientKey[], sortMode: NutritionSortMode, consumed?: Nutrition, target?: Nutrition ): NutrientKey[] { if (sortMode === 'default') { return [...keys].sort((a, b) => NUTRIENT_META[a].importance - NUTRIENT_META[b].importance); } if (!consumed || !target) { return [...keys].sort((a, b) => NUTRIENT_META[a].importance - NUTRIENT_META[b].importance); } return [...keys].sort((a, b) => { const fillA = (consumed[a] ?? 0) / (target[a] || 1); const fillB = (consumed[b] ?? 0) / (target[b] || 1); return fillA - fillB; }); } export function sumNutrition(items: Nutrition[]): Nutrition { const result: Nutrition = {}; for (const item of items) { for (const key of Object.keys(item) as NutrientKey[]) { const val = item[key]; if (val != null) { result[key] = (result[key] ?? 0) + val; } } } return result; } export function emptyNutrition(): Nutrition { return {}; } export function getDailyTargets(date: Date): Nutrition { const dayOfYear = Math.floor( (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000 ); const seed = dayOfYear * 7 + date.getFullYear(); const result: Nutrition = {}; for (const [key, base] of Object.entries(BASE_DAILY_TARGETS)) { const hash = ((seed * 31 + key.charCodeAt(0)) * 17) % 100; const variation = 0.9 + (hash / 100) * 0.2; result[key as NutrientKey] = Math.round(base * variation * 100) / 100; } return result; }