'use client'; import { useState, useEffect } from 'react'; import { Box, Typography, Tabs, Tab, Select, MenuItem, FormControl, InputLabel, CircularProgress, Alert, Grid, IconButton, Button, } from '@mui/material'; import { Timeline, TrendingUp, Assessment, ArrowBack } from '@mui/icons-material'; import { useRouter } from 'next/navigation'; import { childrenApi, Child } from '@/lib/api/children'; import { analyticsApi, PatternInsights, PredictionInsights } from '@/lib/api/analytics'; import { InsightsDashboard } from './InsightsDashboard'; import { EnhancedInsightsDashboard } from './EnhancedInsightsDashboard'; import PredictionsCard from './PredictionsCard'; import GrowthSpurtAlert from './GrowthSpurtAlert'; import ChildSelector from '@/components/common/ChildSelector'; import { motion } from 'framer-motion'; import { useAuth } from '@/lib/auth/AuthContext'; import { ToggleButton, ToggleButtonGroup } from '@mui/material'; import { ShowChart, BubbleChart } from '@mui/icons-material'; interface TabPanelProps { children?: React.ReactNode; index: number; value: number; } function TabPanel(props: TabPanelProps) { const { children, value, index, ...other } = props; return ( ); } export function UnifiedInsightsDashboard() { const router = useRouter(); const { user } = useAuth(); const [children, setChildren] = useState([]); const [selectedChildIds, setSelectedChildIds] = useState([]); const [tabValue, setTabValue] = useState(0); const [loading, setLoading] = useState(true); const [insights, setInsights] = useState(null); const [predictions, setPredictions] = useState(null); const [insightsLoading, setInsightsLoading] = useState(false); const [predictionsLoading, setPredictionsLoading] = useState(false); const [days, setDays] = useState(7); const [error, setError] = useState(''); const [chartMode, setChartMode] = useState<'basic' | 'enhanced'>('basic'); // Get the selected child ID (first one from the array for single selection) const selectedChildId = selectedChildIds[0] || ''; const familyId = user?.families?.[0]?.familyId; useEffect(() => { if (familyId) { loadChildren(); } }, [familyId]); useEffect(() => { if (selectedChildId && children.length > 0) { // Validate that selectedChildId belongs to current user's children const childExists = children.some(child => child.id === selectedChildId); if (childExists) { loadInsights(); loadPredictions(); } else { // Invalid child ID - reset to first child console.warn('[UnifiedInsightsDashboard] Selected child not found in user\'s children, resetting'); setSelectedChildIds([children[0].id]); setError('Selected child not found. Showing data for your first child.'); } } }, [selectedChildId, days, children]); const loadChildren = async () => { if (!familyId) { setLoading(false); setError('No family found'); return; } try { console.log('[UnifiedInsightsDashboard] Loading children for familyId:', familyId); const data = await childrenApi.getChildren(familyId); console.log('[UnifiedInsightsDashboard] Loaded children:', data); setChildren(data); // Only set selectedChildIds if we don't have one or if it's not in the new list if (data.length > 0) { const existingChildStillValid = data.some(child => child.id === selectedChildId); if (!selectedChildId || !existingChildStillValid) { setSelectedChildIds([data[0].id]); } } setError(''); } catch (error) { console.error('[UnifiedInsightsDashboard] Failed to load children:', error); setError('Failed to load children'); } finally { setLoading(false); } }; const loadInsights = async () => { if (!selectedChildId) return; setInsightsLoading(true); try { const data = await analyticsApi.getInsights(selectedChildId, days); setInsights(data); } catch (error) { console.error('Failed to load insights:', error); } finally { setInsightsLoading(false); } }; const loadPredictions = async () => { if (!selectedChildId) return; setPredictionsLoading(true); try { const data = await analyticsApi.getPredictions(selectedChildId); setPredictions(data); } catch (error) { console.error('Failed to load predictions:', error); } finally { setPredictionsLoading(false); } }; if (loading) { return ( ); } if (children.length === 0) { return ( Add a child to your family to view insights and predictions. ); } return ( {/* Header with Back Button */} router.back()} sx={{ mr: 2 }}> Insights & Predictions AI-powered insights, patterns, and predictions for your child {/* Error Alert */} {error && ( setError('')}> {error} )} {/* Shared Filters */} {children.length > 1 && ( setSelectedChildIds(childIds)} mode="single" label="Child" compact={false} /> )} Time Period {/* Growth Spurt Alert */} {insights?.growthSpurt && } {/* Tabs */} setTabValue(newValue)}> } iconPosition="start" /> } iconPosition="start" /> {/* Chart Mode Toggle for Insights Tab */} {tabValue === 0 && ( newMode && setChartMode(newMode)} size="small" > Basic Charts Enhanced Charts )} {/* Tab Panels */} {/* Insights tab shows either basic or enhanced dashboard */} {chartMode === 'basic' ? ( ) : ( )} {/* Predictions tab */} ); }