import React, { useState, useEffect } from 'react'; import { Box, Grid, Paper, Typography, Button, TextField, Card, CardContent, Chip, IconButton, Dialog, DialogTitle, DialogContent, DialogActions, FormControl, InputLabel, Select, MenuItem, Alert, CircularProgress, Tabs, Tab, Accordion, AccordionSummary, AccordionDetails, List, ListItem, ListItemText, ListItemIcon, LinearProgress } from '@mui/material'; import { Add as AddIcon, Edit as EditIcon, Delete as DeleteIcon, CalendarToday as CalendarIcon, Event as EventIcon, Refresh as RefreshIcon, TrendingUp as TrendingIcon, Analytics as AnalyticsIcon, ExpandMore as ExpandMoreIcon, Schedule as ScheduleIcon, Psychology as PsychologyIcon, Business as BusinessIcon, Timeline as TimelineIcon, Lightbulb as LightbulbIcon, CheckCircle as CheckCircleIcon, AutoAwesome as AutoAwesomeIcon } from '@mui/icons-material'; import { useContentPlanningStore } from '../../../stores/contentPlanningStore'; interface TabPanelProps { children?: React.ReactNode; index: number; value: number; } function TabPanel(props: TabPanelProps) { const { children, value, index, ...other } = props; return ( ); } const CalendarTab: React.FC = () => { const { calendarEvents, createEvent, updateEvent, deleteEvent, error, loadCalendarEvents, // New calendar generation state generatedCalendar, calendarGenerationError, dataLoading, calendarGenerationLoading } = useContentPlanningStore(); const [tabValue, setTabValue] = useState(0); const [dialogOpen, setDialogOpen] = useState(false); const [selectedEvent, setSelectedEvent] = useState(null); const [eventForm, setEventForm] = useState({ title: '', description: '', content_type: '', platform: '', scheduled_date: '', status: 'draft' as 'draft' | 'scheduled' | 'published' }); const safeCalendarEvents = Array.isArray(calendarEvents) ? calendarEvents : []; useEffect(() => { loadCalendarData(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const loadCalendarData = async () => { try { // Load existing calendar events await loadCalendarEvents(); } catch (error) { console.error('Error loading calendar data:', error); } }; const handleOpenDialog = (event?: any) => { if (event) { setSelectedEvent(event); setEventForm({ title: event.title, description: event.description, content_type: event.content_type, platform: event.platform, scheduled_date: event.scheduled_date || event.date, status: event.status as 'draft' | 'scheduled' | 'published' }); } else { setSelectedEvent(null); setEventForm({ title: '', description: '', content_type: '', platform: '', scheduled_date: '', status: 'draft' as 'draft' | 'scheduled' | 'published' }); } setDialogOpen(true); }; const handleCloseDialog = () => { setDialogOpen(false); setSelectedEvent(null); }; const handleSaveEvent = async () => { try { const eventData = { title: eventForm.title, description: eventForm.description, content_type: eventForm.content_type, platform: eventForm.platform, date: eventForm.scheduled_date, // Map scheduled_date to date for API compatibility status: eventForm.status as 'draft' | 'scheduled' | 'published' }; if (selectedEvent) { await updateEvent(selectedEvent.id, eventData); } else { await createEvent(eventData); } handleCloseDialog(); } catch (error) { console.error('Error saving event:', error); } }; const handleDeleteEvent = async (eventId: string) => { try { await deleteEvent(eventId); } catch (error) { console.error('Error deleting event:', error); } }; const handleRefreshData = async () => { await loadCalendarData(); }; const getStatusColor = (status: string) => { switch (status) { case 'draft': return 'default'; case 'scheduled': return 'warning'; case 'published': return 'success'; default: return 'default'; } }; const renderGeneratedCalendar = () => { if (!generatedCalendar) { return ( No AI-generated calendar available Generate a calendar using the Calendar Wizard to see AI-powered content recommendations ); } return ( {/* Calendar Overview */} AI-Generated Content Calendar {generatedCalendar.metadata && ( Generated: {new Date(generatedCalendar.metadata.generated_at).toLocaleString()} )} {/* Daily Schedule */} {generatedCalendar.daily_schedule && generatedCalendar.daily_schedule.length > 0 && ( Daily Schedule {generatedCalendar.daily_schedule.map((item: any, index: number) => ( ))} )} {/* Weekly Themes */} {generatedCalendar.weekly_themes && generatedCalendar.weekly_themes.length > 0 && ( Weekly Themes {generatedCalendar.weekly_themes.map((theme: any, index: number) => ( ))} )} {/* Content Recommendations */} {generatedCalendar.content_recommendations && generatedCalendar.content_recommendations.length > 0 && ( Content Recommendations {generatedCalendar.content_recommendations.map((rec: any, index: number) => ( ))} )} {/* Performance Predictions */} {generatedCalendar.performance_predictions && ( Performance Predictions Estimated Engagement {generatedCalendar.performance_predictions.estimated_engagement || 0}% Estimated Reach {generatedCalendar.performance_predictions.estimated_reach || 0} Estimated Conversions {generatedCalendar.performance_predictions.estimated_conversions || 0} )} {/* AI Insights */} {generatedCalendar.ai_insights && generatedCalendar.ai_insights.length > 0 && ( AI Insights {generatedCalendar.ai_insights.map((insight: any, index: number) => ( Confidence: {(insight.confidence * 100).toFixed(0)}% {insight.insight} Action: {insight.action} ))} )} {/* Strategy Data */} {generatedCalendar.strategy_data && Object.keys(generatedCalendar.strategy_data).length > 0 && ( Strategy Integration }> Strategy Analysis & Quality Indicators {generatedCalendar.strategy_analysis && ( Strategy Analysis Completion: {generatedCalendar.strategy_analysis.completion_percentage || 0}% Filled Fields: {generatedCalendar.strategy_analysis.filled_fields || 0}/{generatedCalendar.strategy_analysis.total_fields || 30} )} {generatedCalendar.quality_indicators && ( Quality Indicators Overall Quality: {generatedCalendar.quality_indicators.overall_quality_score || 0}% Strategic Alignment: {generatedCalendar.quality_indicators.strategic_alignment || 0}% )} )} ); }; return ( Content Calendar {error && ( {error} )} {calendarGenerationError && ( {calendarGenerationError} )} {calendarGenerationLoading && ( Generating AI-powered content calendar... )} setTabValue(newValue)}> } iconPosition="start" /> } iconPosition="start" /> {/* Calendar Events Tab */} {dataLoading ? ( ) : ( Scheduled Events {safeCalendarEvents.length === 0 ? ( No events scheduled Create your first content event to get started ) : ( {safeCalendarEvents.map((event) => ( {event.title} handleOpenDialog(event)} > handleDeleteEvent(event.id)} > {event.description} Scheduled: {new Date(event.scheduled_date || event.date || '').toLocaleDateString()} ))} )} )} {/* AI-Generated Calendar Tab */} {dataLoading ? ( ) : ( renderGeneratedCalendar() )} {/* Event Dialog */} {selectedEvent ? 'Edit Event' : 'Add New Event'} setEventForm({ ...eventForm, title: e.target.value })} fullWidth /> setEventForm({ ...eventForm, description: e.target.value })} multiline rows={3} fullWidth /> Content Type Platform setEventForm({ ...eventForm, scheduled_date: e.target.value })} fullWidth InputLabelProps={{ shrink: true }} /> Status ); }; export default CalendarTab;