// Emotion types enum export const Emotions = { JOY: 'joy', TRUST: 'trust', FEAR: 'fear', SURPRISE: 'surprise', SAD: 'sad', DISGUST: 'disgust', ANGRY: 'angry', ANXIETY: 'anxiety' }; // Valid emotion values for validation export const VALID_EMOTIONS = Object.values(Emotions); // Validate emotion type export function isValidEmotion(emotion) { return VALID_EMOTIONS.includes(emotion?.toLowerCase()); } // Validate intensity value export function isValidIntensity(intensity) { const num = Number(intensity); return !isNaN(num) && num >= 1 && num <= 10; } // Validate rating value export function isValidRating(rating) { const num = Number(rating); return !isNaN(num) && num >= 1 && num <= 10; } // Validate level values (stress, anxiety, energy) export function isValidLevel(level) { const num = Number(level); return !isNaN(num) && num >= 1 && num <= 10; } // Validate mood components array export function validateMoodComponents(components) { if (!Array.isArray(components)) { return { valid: false, error: 'Components must be an array' }; } const emotions = new Set(); for (const component of components) { if (!Object.hasOwn(component, 'emotion') || !Object.hasOwn(component, 'intensity')) { return { valid: false, error: 'Each component must have emotion and intensity' }; } const emotionLower = component.emotion.toLowerCase(); if (!isValidEmotion(emotionLower)) { return { valid: false, error: `Invalid emotion: ${component.emotion}` }; } if (!isValidIntensity(component.intensity)) { return { valid: false, error: `Invalid intensity for ${component.emotion}: must be 1-10` }; } if (emotions.has(emotionLower)) { return { valid: false, error: `Duplicate emotion: ${component.emotion}` }; } emotions.add(emotionLower); } return { valid: true }; } // Get emotion statistics export function calculateEmotionStats(moodComponents) { const stats = { dominant: null, average: 0, breakdown: {} }; if (!moodComponents || moodComponents.length === 0) { return stats; } let maxIntensity = 0; let totalIntensity = 0; moodComponents.forEach(component => { const intensity = Number(component.intensity); totalIntensity += intensity; stats.breakdown[component.emotion] = intensity; if (intensity > maxIntensity) { maxIntensity = intensity; stats.dominant = component.emotion; } }); stats.average = totalIntensity / moodComponents.length; return stats; }