'use client' import { useState, useEffect } from 'react' import { useParams, useRouter } from 'next/navigation' import { useLocale } from 'next-intl' import { useAuth } from '@/hooks/use-auth' import { ProtectedRoute } from '@/components/auth/protected-route' import { Container, Box, Typography, Card, CardContent, Button, Chip, CircularProgress, Alert, LinearProgress, IconButton, List, ListItem, ListItemText, ListItemIcon, Checkbox, Paper, Divider, TextField, Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material' import Grid from '@mui/material/Grid' import { ArrowBack, CheckCircle, RadioButtonUnchecked, CalendarToday, LocalFireDepartment, EmojiEvents, TrendingUp, Edit, Save, MenuBook } from '@mui/icons-material' import Link from 'next/link' interface UserPlan { id: string name: string startDate: string targetEndDate: string status: string currentDay: number completedDays: number streak: number longestStreak: number plan?: { id: string name: string description: string duration: number schedule: any } customSchedule?: any progress: ProgressEntry[] } interface ProgressEntry { id: string planDay: number bookId: string chapterNum: number versesRead: string | null completed: boolean notes: string | null date: string } export default function ReadingPlanDetailPage() { const params = useParams() const router = useRouter() const locale = useLocale() const { user } = useAuth() const [loading, setLoading] = useState(true) const [plan, setPlan] = useState(null) const [error, setError] = useState('') const [notesDialog, setNotesDialog] = useState<{ open: boolean; day: number; notes: string }>({ open: false, day: 0, notes: '' }) useEffect(() => { loadPlan() }, [params.id]) const loadPlan = async () => { setLoading(true) setError('') try { const token = localStorage.getItem('authToken') if (!token) { router.push(`/${locale}/login`) return } const response = await fetch(`/api/user/reading-plans/${params.id}`, { headers: { 'Authorization': `Bearer ${token}` } }) const data = await response.json() if (data.success) { setPlan(data.plan) } else { setError(data.error || 'Failed to load reading plan') } } catch (err) { console.error('Error loading plan:', err) setError('Failed to load reading plan') } finally { setLoading(false) } } const markDayComplete = async (day: number, reading: any) => { const token = localStorage.getItem('authToken') if (!token) return try { const response = await fetch(`/api/user/reading-plans/${params.id}/progress`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify({ planDay: day, bookId: reading.book, chapterNum: reading.chapter, versesRead: reading.verses || null, completed: true }) }) const data = await response.json() if (data.success) { loadPlan() // Reload to get updated progress } else { setError(data.error || 'Failed to mark reading complete') } } catch (err) { console.error('Error marking reading complete:', err) setError('Failed to mark reading complete') } } const saveNotes = async () => { const token = localStorage.getItem('authToken') if (!token) return const schedule = plan?.plan?.schedule || plan?.customSchedule if (!schedule || !Array.isArray(schedule)) return const daySchedule = schedule[notesDialog.day - 1] if (!daySchedule || !daySchedule.readings || daySchedule.readings.length === 0) return const reading = daySchedule.readings[0] try { const response = await fetch(`/api/user/reading-plans/${params.id}/progress`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify({ planDay: notesDialog.day, bookId: reading.book, chapterNum: reading.chapter, notes: notesDialog.notes }) }) const data = await response.json() if (data.success) { setNotesDialog({ open: false, day: 0, notes: '' }) loadPlan() } else { setError(data.error || 'Failed to save notes') } } catch (err) { console.error('Error saving notes:', err) setError('Failed to save notes') } } const isDayCompleted = (day: number) => { if (!plan) return false return plan.progress.some(p => p.planDay === day && p.completed) } const getDayNotes = (day: number) => { if (!plan) return '' const entry = plan.progress.find(p => p.planDay === day) return entry?.notes || '' } const getCurrentReading = () => { if (!plan) return null const schedule = plan.plan?.schedule || plan.customSchedule if (!schedule || !Array.isArray(schedule)) return null // Get the current day's reading (or first incomplete day) let dayToRead = plan.currentDay // If current day is completed, find the next incomplete day if (isDayCompleted(dayToRead)) { for (let i = dayToRead; i <= schedule.length; i++) { if (!isDayCompleted(i)) { dayToRead = i break } } } const daySchedule = schedule[dayToRead - 1] if (!daySchedule || !daySchedule.readings || daySchedule.readings.length === 0) { return null } const reading = daySchedule.readings[0] return { day: dayToRead, book: reading.book, chapter: reading.chapter, verses: reading.verses } } if (loading) { return ( ) } if (!plan) { return ( Reading plan not found ) } const schedule = plan.plan?.schedule || plan.customSchedule const duration = plan.plan?.duration || (Array.isArray(schedule) ? schedule.length : 365) const progressPercentage = (plan.completedDays / duration) * 100 return ( {/* Header */} {plan.name} {plan.plan?.description && ( {plan.plan.description} )} {error && ( setError('')}> {error} )} {/* Statistics Cards */} Progress {Math.round(progressPercentage)}% {plan.completedDays} / {duration} days Current Streak {plan.streak} days in a row Best Streak {plan.longestStreak} days record Target Date {new Date(plan.targetEndDate).toLocaleDateString(locale, { month: 'short', day: 'numeric', year: 'numeric' })} {/* Read the Bible Button */} {plan.status === 'ACTIVE' && (() => { const currentReading = getCurrentReading() return currentReading ? ( Day {currentReading.day} of {duration} ) : null })()} {/* Reading Schedule */} Reading Schedule {Array.isArray(schedule) && schedule.map((daySchedule: any, index: number) => { const day = index + 1 const isCompleted = isDayCompleted(day) const isCurrent = day === plan.currentDay const notes = getDayNotes(day) return ( setNotesDialog({ open: true, day, notes })} > { if (!isCompleted && daySchedule.readings && daySchedule.readings.length > 0) { markDayComplete(day, daySchedule.readings[0]) } }} icon={} checkedIcon={} /> } > {daySchedule.readings?.map((reading: any, i: number) => ( {reading.book} {reading.chapter} {reading.verses && `:${reading.verses}`} {i < daySchedule.readings.length - 1 && ', '} ))} } secondary={notes && `Notes: ${notes}`} /> ) })} {(!schedule || !Array.isArray(schedule)) && ( No schedule available for this plan )} {/* Notes Dialog */} setNotesDialog({ open: false, day: 0, notes: '' })} maxWidth="sm" fullWidth> Add Notes - Day {notesDialog.day} setNotesDialog({ ...notesDialog, notes: e.target.value })} placeholder="Add your thoughts, insights, or reflections..." sx={{ mt: 2 }} /> ) }