import React, { useState, useEffect } from 'react';
import {
Box,
Grid,
Paper,
Typography,
Card,
CardContent,
Chip,
Divider,
Alert,
CircularProgress,
LinearProgress,
Tabs,
Tab,
Button
} from '@mui/material';
import {
TrendingUp as TrendingUpIcon,
Analytics as AnalyticsIcon,
ShowChart as ShowChartIcon,
Assessment as AssessmentIcon,
Visibility as VisibilityIcon,
Timeline as TimelineIcon,
AutoAwesome as AutoAwesomeIcon,
Refresh as RefreshIcon
} from '@mui/icons-material';
import { useContentPlanningStore } from '../../../stores/contentPlanningStore';
import { contentPlanningApi } from '../../../services/contentPlanningApi';
import EnhancedPerformanceVisualization from '../components/StrategyIntelligence/components/EnhancedPerformanceVisualization';
import TrendAnalysis from '../components/StrategyIntelligence/components/TrendAnalysis';
import DataTransparencyPanel from '../components/StrategyIntelligence/components/DataTransparencyPanel';
interface TabPanelProps {
children?: React.ReactNode;
index: number;
value: number;
}
function TabPanel(props: TabPanelProps) {
const { children, value, index, ...other } = props;
return (
{value === index && {children}}
);
}
const AnalyticsTab: React.FC = () => {
const {
currentStrategy,
error: storeError
} = useContentPlanningStore();
const [analyticsData, setAnalyticsData] = useState(null);
const [dataLoading, setDataLoading] = useState(false);
const [error, setError] = useState(null);
const [activeTab, setActiveTab] = useState(0);
// Cache for analytics data to prevent redundant calls
const [lastLoadTime, setLastLoadTime] = useState(0);
const CACHE_DURATION = 5 * 60 * 1000; // 5 minutes
useEffect(() => {
loadAnalyticsData();
}, []);
const loadAnalyticsData = async () => {
try {
// Check if we have recent cached data to avoid redundant calls
const now = Date.now();
if (analyticsData && (now - lastLoadTime) < CACHE_DURATION) {
console.log('🎯 Using cached analytics data (cache valid for', Math.round((CACHE_DURATION - (now - lastLoadTime)) / 1000), 'seconds)');
return;
}
setDataLoading(true);
setError(null);
console.log('🎯 Loading analytics data...');
// Get strategy ID
const strategyId = Number(currentStrategy?.id) || currentStrategy?.user_id || 1;
// First, try to load from database (monitoring data)
try {
console.log('🎯 Fetching analytics data from database...');
const response = await fetch(`/api/content-planning/strategy/${strategyId}/analytics-data`);
if (response.ok) {
const result = await response.json();
const dbAnalyticsData = result.data;
console.log('✅ Analytics data from database:', dbAnalyticsData);
setAnalyticsData(dbAnalyticsData);
setLastLoadTime(Date.now());
return;
} else {
console.warn('⚠️ Database fetch failed, trying cache...');
}
} catch (dbError) {
console.warn('⚠️ Database fetch error, trying cache:', dbError);
}
// Fallback to cached monitoring data
const strategyAnalyticsData = localStorage.getItem('strategy_analytics_data');
const monitoringTasks = localStorage.getItem('strategy_monitoring_tasks');
console.log('🎯 Checking cached monitoring data...');
if (strategyAnalyticsData && monitoringTasks) {
console.log('✅ Found cached monitoring data');
const cachedData = JSON.parse(strategyAnalyticsData);
const tasks = JSON.parse(monitoringTasks);
const analyticsData = {
performance_trends: cachedData.monitoring_plan?.performance_metrics || {},
content_evolution: cachedData.monitoring_plan?.content_evolution || {},
engagement_patterns: cachedData.monitoring_plan?.engagement_patterns || {},
recommendations: cachedData.monitoring_plan?.recommendations || [],
insights: cachedData.monitoring_plan?.insights || [],
monitoring_data: cachedData,
monitoring_tasks: tasks,
_source: 'cached_monitoring'
};
console.log('✅ Analytics Data from cache:', analyticsData);
setAnalyticsData(analyticsData);
setLastLoadTime(Date.now());
} else {
// No data available
console.log('⚠️ No monitoring data found in database or cache');
const emptyData = {
performance_trends: {},
content_evolution: {},
engagement_patterns: {},
recommendations: [],
insights: [],
monitoring_data: null,
monitoring_tasks: [],
_source: 'empty'
};
setAnalyticsData(emptyData);
setLastLoadTime(Date.now());
setError('No monitoring data available. Please activate a strategy first.');
}
} catch (error) {
console.error('❌ Error loading analytics data:', error);
setError('Failed to load analytics data. Please try again.');
} finally {
setDataLoading(false);
}
};
const handleTabChange = (event: React.SyntheticEvent, newValue: number) => {
setActiveTab(newValue);
};
const handleRefresh = () => {
console.log('🔄 Manual refresh requested');
setLastLoadTime(0); // Reset cache
loadAnalyticsData();
};
const getPerformanceColor = (value: number) => {
if (value >= 80) return 'success';
if (value >= 60) return 'warning';
return 'error';
};
// Get strategy ID for performance components
const strategyId = Number(currentStrategy?.id) || currentStrategy?.user_id || 1;
return (
Analytics Dashboard
}
onClick={handleRefresh}
disabled={dataLoading}
sx={{ minWidth: 120 }}
>
{dataLoading ? 'Refreshing...' : 'Refresh'}
{(error || storeError) && (
{error || storeError}
)}
{/* Data Source Indicator */}
{analyticsData && (
}
>
Data source: {analyticsData._source === 'database_monitoring' ? 'Monitoring database' :
analyticsData._source === 'cached_monitoring' ? 'Local cache' :
analyticsData._source === 'empty' ? 'No monitoring data available' : 'Unknown source'}
)}
{/* Tabs Navigation */}
} iconPosition="start" />
} iconPosition="start" />
} iconPosition="start" />
{/* Performance Analytics Tab */}
{/* Content Analytics Tab */}
{dataLoading ? (
) : (
{/* Performance Overview */}
Performance Overview
{analyticsData && analyticsData.performance_trends ? (
Engagement Rate
{analyticsData.performance_trends.engagement_rate || 0}%
Traffic Growth
{analyticsData.performance_trends.traffic_growth || 0}%
Conversion Rate
{analyticsData.performance_trends.conversion_rate || 0}%
Content Quality
{analyticsData.performance_trends.content_quality_score || 0}/100
) : (
No performance data available
)}
{/* AI Insights */}
AI Insights
{analyticsData && analyticsData.insights && analyticsData.insights.length > 0 ? (
{analyticsData.insights.slice(0, 3).map((insight: any, index: number) => (
{insight.title || `Insight ${index + 1}`}
{insight.description || insight}
))}
) : (
No insights available
)}
{/* Content Evolution */}
{analyticsData && analyticsData.content_evolution && (
Content Evolution
{analyticsData.content_evolution.content_types ? (
{analyticsData.content_evolution.content_types.map((contentType: string, index: number) => {
const performance = analyticsData.content_evolution.performance_by_type?.[contentType];
return (
{contentType.replace('_', ' ')}
{performance && (
Growth
+{performance.growth}%
Engagement
{performance.engagement}%
)}
);
})}
) : (
No content evolution data available
)}
)}
{/* Performance Trends */}
{analyticsData && analyticsData.performance_trends && (
Performance Trends
{analyticsData.performance_trends.engagement_trend ? (
Engagement Trend (Last 5 periods)
{analyticsData.performance_trends.engagement_trend.map((value: number, index: number) => (
{value}%
Period {index + 1}
))}
) : (
No trend data available
)}
)}
{/* Engagement Patterns */}
{analyticsData && analyticsData.engagement_patterns && (
Engagement Patterns
{analyticsData.engagement_patterns.peak_times && (
Peak Engagement Times
{analyticsData.engagement_patterns.peak_times.map((time: string, index: number) => (
))}
)}
{analyticsData.engagement_patterns.best_days && (
Best Performing Days
{analyticsData.engagement_patterns.best_days.map((day: string, index: number) => (
))}
)}
{analyticsData.engagement_patterns.audience_segments && (
Top Audience Segments
{analyticsData.engagement_patterns.audience_segments.map((segment: string, index: number) => (
))}
)}
)}
{/* Recommendations */}
{analyticsData && analyticsData.recommendations && analyticsData.recommendations.length > 0 && (
AI Recommendations
{analyticsData.recommendations.map((recommendation: any, index: number) => (
{recommendation.title}
{recommendation.description}
))}
)}
)}
{/* Data Transparency Tab */}
);
};
export default AnalyticsTab;