'use client' import React, { useState, useEffect } from 'react' import { useParams, useRouter } from 'next/navigation' import { Brain, Trophy, Target, ArrowRight, CheckCircle, XCircle } from 'lucide-react' interface Question { question_id: string question_text: string options: string[] correct_answer: string difficulty: string points: number explanation: string } interface SessionStats { current_difficulty?: string consecutive_correct?: { easy: number medium: number hard: number } total_questions?: number correct_answers?: number score?: number accuracy?: number } export default function QuizPlayPage() { const params = useParams() const router = useRouter() const sessionId = params.sessionId as string const [currentQuestion, setCurrentQuestion] = useState(null) const [sessionStats, setSessionStats] = useState({ current_difficulty: 'easy', consecutive_correct: { easy: 0, medium: 0, hard: 0 }, total_questions: 0, correct_answers: 0, score: 0, accuracy: 0 }) const [selectedAnswer, setSelectedAnswer] = useState('') const [showResult, setShowResult] = useState(false) const [lastResult, setLastResult] = useState(null) const [loading, setLoading] = useState(true) const [quizCompleted, setQuizCompleted] = useState(false) // ✅ Safe getter for current difficulty with fallback const getCurrentDifficulty = () => { return sessionStats?.current_difficulty || 'easy' } // ✅ Safe getter for consecutive correct with fallback const getConsecutiveCorrect = () => { return sessionStats?.consecutive_correct || { easy: 0, medium: 0, hard: 0 } } // Fetch next question const fetchNextQuestion = async () => { try { setLoading(true) const response = await fetch(`http://127.0.0.1:5000/api/quizzes/session/${sessionId}/next-question`) const data = await response.json() console.log('Next question response:', data) // ✅ Debug log if (data.success) { if (data.quiz_completed) { setQuizCompleted(true) setCurrentQuestion(null) } else { setCurrentQuestion(data.question) // ✅ Safely update session stats with fallbacks setSessionStats(prev => ({ current_difficulty: data.session_stats?.current_difficulty || prev.current_difficulty || 'easy', consecutive_correct: data.session_stats?.consecutive_correct || prev.consecutive_correct || { easy: 0, medium: 0, hard: 0 }, total_questions: data.session_stats?.total_questions || prev.total_questions || 0, correct_answers: data.session_stats?.correct_answers || prev.correct_answers || 0, score: data.session_stats?.score || prev.score || 0, accuracy: data.session_stats?.accuracy || prev.accuracy || 0 })) } } else { alert(`Error: ${data.error}`) } } catch (error) { console.error('Fetch question error:', error) alert('Failed to fetch next question') } finally { setLoading(false) } } // Submit answer const submitAnswer = async () => { if (!selectedAnswer || !currentQuestion) return try { setLoading(true) const response = await fetch(`http://127.0.0.1:5000/api/quizzes/session/${sessionId}/submit-answer`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ answer: selectedAnswer, question_data: currentQuestion }) }) const data = await response.json() console.log('Submit answer response:', data) // ✅ Debug log if (data.success) { setLastResult(data) setShowResult(true) // ✅ Safely update session stats with fallbacks setSessionStats(prev => ({ current_difficulty: data.session_stats?.current_difficulty || prev.current_difficulty || 'easy', consecutive_correct: data.session_stats?.consecutive_correct || prev.consecutive_correct || { easy: 0, medium: 0, hard: 0 }, total_questions: data.session_stats?.total_questions || prev.total_questions || 0, correct_answers: data.session_stats?.correct_answers || prev.correct_answers || 0, score: data.session_stats?.score || prev.score || 0, accuracy: data.session_stats?.accuracy || prev.accuracy || 0 })) } else { alert(`Error: ${data.error}`) } } catch (error) { console.error('Submit answer error:', error) alert('Failed to submit answer') } finally { setLoading(false) } } // Continue to next question const continueToNext = () => { setShowResult(false) setSelectedAnswer('') setLastResult(null) fetchNextQuestion() } // Initial load useEffect(() => { if (sessionId) { fetchNextQuestion() } }, [sessionId]) const getDifficultyColor = (difficulty: string) => { switch (difficulty) { case 'easy': return 'text-green-400 bg-green-900' case 'medium': return 'text-yellow-400 bg-yellow-900' case 'hard': return 'text-red-400 bg-red-900' default: return 'text-gray-400 bg-gray-700' } } if (loading && !currentQuestion) { return (

Loading question...

) } if (quizCompleted) { return (

🎉 Quiz Completed!

Final Results

{sessionStats.score || 0}
Final Score
{sessionStats.accuracy || 0}%
Accuracy
{sessionStats.total_questions || 0}
Questions
{getCurrentDifficulty().toUpperCase()}
Final Level
) } if (showResult && lastResult) { return (
{lastResult.is_correct ? ( ) : ( )}

{lastResult.is_correct ? '✅ Correct!' : '❌ Incorrect'}

{lastResult.is_correct ? 'Great job!' : 'Keep trying!'}

Correct Answer:

{lastResult.correct_answer}

{lastResult.explanation && (

Explanation:

{lastResult.explanation}

)}
{/* Difficulty Change Notification */} {lastResult.difficulty_changed && (

📈 Difficulty Updated!

Moved from {lastResult.previous_difficulty} to {lastResult.new_difficulty}

)} {/* Session Stats */}

📊 Your Progress

{sessionStats.score || 0}
Score
{sessionStats.accuracy || 0}%
Accuracy
{/* AI Feedback */} {lastResult.ai_feedback && (

🤖 AI Analysis

AI predicted: {lastResult.ai_feedback.ai_prediction} {lastResult.ai_feedback.ai_agrees ? ' ✅ (Agrees with correct answer)' : ' ❌ (Disagrees)'}

Confidence: {Math.round(lastResult.ai_feedback.ai_confidence * 100)}%

)}
) } if (!currentQuestion) { return (

No question available

) } return (
{/* Header with Stats */}
{getCurrentDifficulty().toUpperCase()} Question {(sessionStats.total_questions || 0) + 1}
{sessionStats.score || 0}
Score
{sessionStats.accuracy || 0}%
Accuracy
{getConsecutiveCorrect()[getCurrentDifficulty()] || 0}
Streak
{/* Question */}

{currentQuestion.question_text}

{currentQuestion.options.map((option, index) => ( ))}
{/* Submit Button */}
) }