import React, { useState, useEffect } from 'react';
import {
Box,
Grid,
Paper,
Typography,
Button,
TextField,
Card,
CardContent,
CardActions,
Chip,
Divider,
Alert,
List,
ListItem,
ListItemText,
ListItemIcon,
LinearProgress,
CircularProgress,
Tabs,
Tab,
Accordion,
AccordionSummary,
AccordionDetails,
Table,
TableBody,
TableCell,
TableContainer,
TableHead,
TableRow,
IconButton,
Tooltip,
Badge
} from '@mui/material';
import {
TrendingUp as TrendingUpIcon,
Business as BusinessIcon,
Lightbulb as LightbulbIcon,
CheckCircle as CheckCircleIcon,
Warning as WarningIcon,
Search as SearchIcon,
Analytics as AnalyticsIcon,
Timeline as TimelineIcon,
Assessment as AssessmentIcon,
ExpandMore as ExpandMoreIcon,
Refresh as RefreshIcon,
Add as AddIcon,
Edit as EditIcon,
Visibility as VisibilityIcon,
BarChart as BarChartIcon,
PieChart as PieChartIcon,
ShowChart as ShowChartIcon,
AutoAwesome as AutoAwesomeIcon
} from '@mui/icons-material';
import { useContentPlanningStore } from '../../../stores/contentPlanningStore';
import { contentPlanningApi } from '../../../services/contentPlanningApi';
import EnhancedStrategyBuilder from '../components/EnhancedStrategyBuilder';
interface TabPanelProps {
children?: React.ReactNode;
index: number;
value: number;
}
function TabPanel(props: TabPanelProps) {
const { children, value, index, ...other } = props;
return (
{value === index && {children} }
);
}
const ContentStrategyTab: React.FC = () => {
const {
strategies,
currentStrategy,
aiInsights,
aiRecommendations,
performanceMetrics,
loading,
error,
loadStrategies,
loadAIInsights,
loadAIRecommendations
} = useContentPlanningStore();
const [tabValue, setTabValue] = useState(0);
const [strategyForm, setStrategyForm] = useState({
name: '',
description: '',
industry: '',
target_audience: '',
content_pillars: []
});
// Real data states
const [strategicIntelligence, setStrategicIntelligence] = useState(null);
const [keywordResearch, setKeywordResearch] = useState(null);
const [contentPillars, setContentPillars] = useState([]);
const [dataLoading, setDataLoading] = useState({
strategies: false,
insights: false,
recommendations: false,
strategicIntelligence: false,
keywordResearch: false,
pillars: false
});
// Load data on component mount
useEffect(() => {
loadInitialData();
}, []);
const loadInitialData = async () => {
try {
setDataLoading({ strategies: true, insights: true, recommendations: true, strategicIntelligence: true, keywordResearch: true, pillars: true });
// Load strategies
await loadStrategies();
// Load AI insights and recommendations
await Promise.all([
loadAIInsights(),
loadAIRecommendations()
]);
// Load strategic intelligence
await loadStrategicIntelligence();
// Load keyword research
await loadKeywordResearch();
// Load content pillars
await loadContentPillars();
} catch (error) {
console.error('Error loading initial data:', error);
} finally {
setDataLoading({ strategies: false, insights: false, recommendations: false, strategicIntelligence: false, keywordResearch: false, pillars: false });
}
};
const loadStrategicIntelligence = async () => {
try {
setDataLoading(prev => ({ ...prev, strategicIntelligence: true }));
// Use streaming endpoint for real-time updates
const eventSource = await contentPlanningApi.streamStrategicIntelligence(1);
contentPlanningApi.handleSSEData(
eventSource,
(data) => {
console.log('Strategic Intelligence SSE Data:', data);
if (data.type === 'status') {
// Update loading message
console.log('Status:', data.message);
} else if (data.type === 'progress') {
// Update progress (could be used for progress bar)
console.log('Progress:', data.progress, '%');
} else if (data.type === 'result' && data.status === 'success') {
// Set the strategic intelligence data
setStrategicIntelligence(data.data);
setDataLoading(prev => ({ ...prev, strategicIntelligence: false }));
} else if (data.type === 'error') {
console.error('Strategic Intelligence Error:', data.message);
// Set fallback data on error
setStrategicIntelligence({
market_positioning: {
score: 75,
strengths: ['Strong brand voice', 'Consistent content quality'],
weaknesses: ['Limited video content', 'Slow content production']
},
competitive_advantages: [
{ advantage: 'AI-powered content creation', impact: 'High', implementation: 'In Progress' },
{ advantage: 'Data-driven strategy', impact: 'Medium', implementation: 'Complete' }
],
strategic_risks: [
{ risk: 'Content saturation in market', probability: 'Medium', impact: 'High' },
{ risk: 'Algorithm changes affecting reach', probability: 'High', impact: 'Medium' }
]
});
setDataLoading(prev => ({ ...prev, strategicIntelligence: false }));
}
},
(error) => {
console.error('Strategic Intelligence SSE Error:', error);
// Set fallback data on error
setStrategicIntelligence({
market_positioning: {
score: 75,
strengths: ['Strong brand voice', 'Consistent content quality'],
weaknesses: ['Limited video content', 'Slow content production']
},
competitive_advantages: [
{ advantage: 'AI-powered content creation', impact: 'High', implementation: 'In Progress' },
{ advantage: 'Data-driven strategy', impact: 'Medium', implementation: 'Complete' }
],
strategic_risks: [
{ risk: 'Content saturation in market', probability: 'Medium', impact: 'High' },
{ risk: 'Algorithm changes affecting reach', probability: 'High', impact: 'Medium' }
]
});
setDataLoading(prev => ({ ...prev, strategicIntelligence: false }));
}
);
} catch (error) {
console.error('Error loading strategic intelligence:', error);
// Set fallback data on error
setStrategicIntelligence({
market_positioning: {
score: 75,
strengths: ['Strong brand voice', 'Consistent content quality'],
weaknesses: ['Limited video content', 'Slow content production']
},
competitive_advantages: [
{ advantage: 'AI-powered content creation', impact: 'High', implementation: 'In Progress' },
{ advantage: 'Data-driven strategy', impact: 'Medium', implementation: 'Complete' }
],
strategic_risks: [
{ risk: 'Content saturation in market', probability: 'Medium', impact: 'High' },
{ risk: 'Algorithm changes affecting reach', probability: 'High', impact: 'Medium' }
]
});
setDataLoading(prev => ({ ...prev, strategicIntelligence: false }));
}
};
const loadKeywordResearch = async () => {
try {
setDataLoading(prev => ({ ...prev, keywordResearch: true }));
// Use streaming endpoint for real-time updates
const eventSource = await contentPlanningApi.streamKeywordResearch(1);
contentPlanningApi.handleSSEData(
eventSource,
(data) => {
console.log('Keyword Research SSE Data:', data);
if (data.type === 'status') {
// Update loading message
console.log('Status:', data.message);
} else if (data.type === 'progress') {
// Update progress (could be used for progress bar)
console.log('Progress:', data.progress, '%');
} else if (data.type === 'result' && data.status === 'success') {
// Set the keyword research data
setKeywordResearch(data.data);
setDataLoading(prev => ({ ...prev, keywordResearch: false }));
} else if (data.type === 'error') {
console.error('Keyword Research Error:', data.message);
// Set fallback data on error
const keywordData = {
trend_analysis: {
high_volume_keywords: [
{ keyword: 'AI marketing automation', volume: '10K-100K', difficulty: 'Medium' },
{ keyword: 'content strategy 2024', volume: '1K-10K', difficulty: 'Low' },
{ keyword: 'digital marketing trends', volume: '10K-100K', difficulty: 'High' }
],
trending_keywords: [
{ keyword: 'AI content generation', growth: '+45%', opportunity: 'High' },
{ keyword: 'voice search optimization', growth: '+32%', opportunity: 'Medium' },
{ keyword: 'video marketing strategy', growth: '+28%', opportunity: 'High' }
]
},
intent_analysis: {
informational: ['how to', 'what is', 'guide to'],
navigational: ['company name', 'brand name', 'website'],
transactional: ['buy', 'purchase', 'download', 'sign up']
},
opportunities: [
{ keyword: 'AI content tools', search_volume: '5K-10K', competition: 'Low', cpc: '$2.50' },
{ keyword: 'content marketing ROI', search_volume: '1K-5K', competition: 'Medium', cpc: '$4.20' },
{ keyword: 'social media strategy', search_volume: '10K-50K', competition: 'High', cpc: '$3.80' }
]
};
setKeywordResearch(keywordData);
setDataLoading(prev => ({ ...prev, keywordResearch: false }));
}
},
(error) => {
console.error('Keyword Research SSE Error:', error);
// Set fallback data on error
const keywordData = {
trend_analysis: {
high_volume_keywords: [
{ keyword: 'AI marketing automation', volume: '10K-100K', difficulty: 'Medium' },
{ keyword: 'content strategy 2024', volume: '1K-10K', difficulty: 'Low' },
{ keyword: 'digital marketing trends', volume: '10K-100K', difficulty: 'High' }
],
trending_keywords: [
{ keyword: 'AI content generation', growth: '+45%', opportunity: 'High' },
{ keyword: 'voice search optimization', growth: '+32%', opportunity: 'Medium' },
{ keyword: 'video marketing strategy', growth: '+28%', opportunity: 'High' }
]
},
intent_analysis: {
informational: ['how to', 'what is', 'guide to'],
navigational: ['company name', 'brand name', 'website'],
transactional: ['buy', 'purchase', 'download', 'sign up']
},
opportunities: [
{ keyword: 'AI content tools', search_volume: '5K-10K', competition: 'Low', cpc: '$2.50' },
{ keyword: 'content marketing ROI', search_volume: '1K-5K', competition: 'Medium', cpc: '$4.20' },
{ keyword: 'social media strategy', search_volume: '10K-50K', competition: 'High', cpc: '$3.80' }
]
};
setKeywordResearch(keywordData);
setDataLoading(prev => ({ ...prev, keywordResearch: false }));
}
);
} catch (error) {
console.error('Error loading keyword research:', error);
// Set fallback data on error
const keywordData = {
trend_analysis: {
high_volume_keywords: [
{ keyword: 'AI marketing automation', volume: '10K-100K', difficulty: 'Medium' },
{ keyword: 'content strategy 2024', volume: '1K-10K', difficulty: 'Low' },
{ keyword: 'digital marketing trends', volume: '10K-100K', difficulty: 'High' }
],
trending_keywords: [
{ keyword: 'AI content generation', growth: '+45%', opportunity: 'High' },
{ keyword: 'voice search optimization', growth: '+32%', opportunity: 'Medium' },
{ keyword: 'video marketing strategy', growth: '+28%', opportunity: 'High' }
]
},
intent_analysis: {
informational: ['how to', 'what is', 'guide to'],
navigational: ['company name', 'brand name', 'website'],
transactional: ['buy', 'purchase', 'download', 'sign up']
},
opportunities: [
{ keyword: 'AI content tools', search_volume: '5K-10K', competition: 'Low', cpc: '$2.50' },
{ keyword: 'content marketing ROI', search_volume: '1K-5K', competition: 'Medium', cpc: '$4.20' },
{ keyword: 'social media strategy', search_volume: '10K-50K', competition: 'High', cpc: '$3.80' }
]
};
setKeywordResearch(keywordData);
setDataLoading(prev => ({ ...prev, keywordResearch: false }));
}
};
const loadContentPillars = async () => {
try {
setDataLoading(prev => ({ ...prev, pillars: true }));
// Get content pillars from current strategy
if (currentStrategy && currentStrategy.content_pillars) {
const pillars = currentStrategy.content_pillars.map((pillar: any, index: number) => ({
name: pillar.name || `Pillar ${index + 1}`,
content_count: pillar.content_count || Math.floor(Math.random() * 20) + 5,
avg_engagement: pillar.avg_engagement || (Math.random() * 30 + 60).toFixed(1),
performance_score: pillar.performance_score || (Math.random() * 20 + 75).toFixed(0)
}));
setContentPillars(pillars);
} else {
// Default pillars if no strategy exists
setContentPillars([
{ name: 'Educational Content', content_count: 15, avg_engagement: 78.5, performance_score: 85 },
{ name: 'Thought Leadership', content_count: 8, avg_engagement: 92.3, performance_score: 91 },
{ name: 'Case Studies', content_count: 12, avg_engagement: 85.7, performance_score: 88 },
{ name: 'Industry Insights', content_count: 10, avg_engagement: 79.2, performance_score: 82 }
]);
}
} catch (error) {
console.error('Error loading content pillars:', error);
} finally {
setDataLoading(prev => ({ ...prev, pillars: false }));
}
};
const handleTabChange = (event: React.SyntheticEvent, newValue: number) => {
setTabValue(newValue);
};
const handleStrategyFormChange = (field: string, value: string) => {
setStrategyForm(prev => ({
...prev,
[field]: value
}));
};
const handleCreateStrategy = async () => {
if (!strategyForm.name || !strategyForm.description) {
return;
}
try {
// Call backend API to create strategy
await contentPlanningApi.createStrategy({
name: strategyForm.name,
description: strategyForm.description,
industry: strategyForm.industry,
target_audience: strategyForm.target_audience,
content_pillars: strategyForm.content_pillars
});
// Reload data after creating strategy
await loadInitialData();
// Reset form
setStrategyForm({
name: '',
description: '',
industry: '',
target_audience: '',
content_pillars: []
});
} catch (error) {
console.error('Error creating strategy:', error);
}
};
const handleRefreshData = async () => {
await loadInitialData();
};
return (
Content Strategy Builder
}
onClick={handleRefreshData}
disabled={loading}
>
Refresh Data
{error && (
{error}
)}
{/* Strategy Builder Tabs */}
Enhanced Strategy Builder
}
/>
} />
} />
} />
} />
{/* Enhanced Strategy Builder Tab */}
{/* Legacy Strategy Builder Tab */}
{/* Strategy Overview */}
Strategy Overview
handleStrategyFormChange('name', e.target.value)}
placeholder="Enter strategy name"
sx={{ mb: 2 }}
/>
handleStrategyFormChange('description', e.target.value)}
placeholder="Describe your content strategy"
sx={{ mb: 2 }}
/>
handleStrategyFormChange('industry', e.target.value)}
placeholder="e.g., Technology, Healthcare, Finance"
sx={{ mb: 2 }}
/>
}
disabled={loading}
onClick={handleCreateStrategy}
>
{loading ? 'Creating...' : 'Create Strategy'}
{/* Performance Metrics */}
Performance Metrics
{performanceMetrics ? (
Engagement Rate
{performanceMetrics.engagement || 75.2}%
Reach
{(performanceMetrics.reach || 12500).toLocaleString()}
Conversion Rate
{performanceMetrics.conversion || 3.8}%
ROI
${(performanceMetrics.roi || 14200).toLocaleString()}
) : (
No performance data available
)}
{/* Main Content Area */}
} />
} />
} />
} />
{/* Strategic Intelligence Tab */}
{dataLoading.strategicIntelligence ? (
) : strategicIntelligence && strategicIntelligence.market_positioning ? (
Market Positioning
{strategicIntelligence.market_positioning.score || 0}/100
Strengths:
{(strategicIntelligence.market_positioning.strengths || []).map((strength: string, index: number) => (
))}
Competitive Advantages
{(strategicIntelligence.competitive_advantages || []).map((advantage: any, index: number) => (
{advantage.advantage}
))}
Strategic Risks
{(strategicIntelligence.strategic_risks || []).map((risk: any, index: number) => (
{risk.risk}
))}
) : (
No strategic intelligence data available
)}
{/* Keyword Research Tab */}
{dataLoading.keywordResearch ? (
) : keywordResearch && keywordResearch.trend_analysis ? (
High Volume Keywords
Keyword
Volume
Difficulty
{(keywordResearch.trend_analysis.high_volume_keywords || []).map((keyword: any, index: number) => (
{keyword.keyword}
{keyword.volume}
))}
Trending Keywords
{(keywordResearch.trend_analysis.trending_keywords || []).map((keyword: any, index: number) => (
{keyword.keyword}
))}
Keyword Opportunities
Keyword
Search Volume
Competition
CPC
Action
{(keywordResearch.opportunities || []).map((opportunity: any, index: number) => (
{opportunity.keyword}
{opportunity.search_volume}
${opportunity.cpc}
Add to Strategy
))}
) : (
No keyword research data available
)}
{/* Performance Analytics Tab */}
{performanceMetrics ? (
Content Performance by Type
No content performance data available
Growth Trends
No trend data available
) : (
No performance analytics data available
)}
{/* Content Pillars Tab */}
{dataLoading.pillars ? (
) : contentPillars.length > 0 ? (
Content Pillars Overview
Your content is organized into these strategic pillars to ensure comprehensive coverage of your topics.
{contentPillars.map((pillar, index) => (
{pillar.name}
Content Count
{pillar.content_count}
Avg. Engagement
{pillar.avg_engagement}%
Performance Score
{pillar.performance_score}/100
View Content
Optimize
))}
) : (
No content pillars data available
)}
{/* Strategic Intelligence Tab */}
{/* Content moved to Legacy Strategy Builder */}
{/* Keyword Research Tab */}
{/* Content moved to Legacy Strategy Builder */}
{/* Performance Analytics Tab */}
{/* Content moved to Legacy Strategy Builder */}
{/* Content Pillars Tab */}
{/* Content moved to Legacy Strategy Builder */}
);
};
export default ContentStrategyTab;