'use client' import React, { useState, useEffect } from 'react' import { Brain, Target, TrendingUp, Clock, Award, Sparkles, ChevronRight } from 'lucide-react' interface Question { question_id: string question_text: string choices: { A: string B: string C: string D: string } correct_answer: string difficulty: string category: string } interface SessionStats { session_id: string current_difficulty: string total_questions: number total_correct: number overall_accuracy: number consecutive_correct: { easy: number medium: number hard: number } difficulty_breakdown: { [key: string]: { questions: number correct: number accuracy: number } } model_available: boolean } export default function AdaptiveQuizPage() { const [sessionId, setSessionId] = useState(null) const [currentQuestion, setCurrentQuestion] = useState(null) const [selectedAnswer, setSelectedAnswer] = useState('') const [sessionStats, setSessionStats] = useState(null) const [loading, setLoading] = useState(false) const [quizStarted, setQuizStarted] = useState(false) const [quizCompleted, setQuizCompleted] = useState(false) const [lastResult, setLastResult] = useState(null) const [showPrediction, setShowPrediction] = useState(false) const [aiPrediction, setAIPrediction] = useState(null) const startQuiz = async () => { setLoading(true) try { const response = await fetch('http://127.0.0.1:5000/api/adaptive-quiz/start', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ user_id: `user_${Date.now()}` }) }) const data = await response.json() if (data.success) { setSessionId(data.session_id) setCurrentQuestion(data.question) setSessionStats(data.session_stats) setQuizStarted(true) } else { alert(`Failed to start quiz: ${data.error}`) } } catch (error) { alert('Network error: Could not start quiz') } finally { setLoading(false) } } const submitAnswer = async () => { if (!selectedAnswer || !currentQuestion || !sessionId) return setLoading(true) try { const response = await fetch(`http://127.0.0.1:5000/api/adaptive-quiz/${sessionId}/answer`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ answer: selectedAnswer, question_data: currentQuestion }) }) const data = await response.json() if (data.success) { setLastResult(data.result) if (data.quiz_completed) { setQuizCompleted(true) setSessionStats(data.final_stats) } else { setCurrentQuestion(data.next_question) setSessionStats(data.session_stats) } setSelectedAnswer('') setShowPrediction(false) setAIPrediction(null) } else { alert(`Error: ${data.error}`) } } catch (error) { alert('Network error: Could not submit answer') } finally { setLoading(false) } } const getAIPrediction = async () => { if (!currentQuestion) return try { const response = await fetch('http://127.0.0.1:5000/api/adaptive-quiz/predict', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ question_text: currentQuestion.question_text, choices: currentQuestion.choices }) }) const data = await response.json() if (data.success) { setAIPrediction(data.prediction) setShowPrediction(true) } } catch (error) { console.error('Failed to get AI prediction:', error) } } 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 (!quizStarted) { return (

🧠 Adaptive AI Quiz

Experience an intelligent quiz that adapts to your skill level in real-time using our trained CNN model.

Adaptive Difficulty

Questions adjust based on your performance

AI Predictions

See how our AI model would answer

Smart Analytics

Track performance across difficulty levels

) } if (quizCompleted) { return (

Quiz Complete! 🎉

You've completed the adaptive quiz. Here are your results:

{sessionStats && (
{sessionStats.total_questions}
Total Questions
{sessionStats.overall_accuracy}%
Overall Accuracy
{sessionStats.current_difficulty}
Final Difficulty
{sessionStats.total_correct}/{sessionStats.total_questions}
Correct Answers
)} {sessionStats && (

Performance by Difficulty

{Object.entries(sessionStats.difficulty_breakdown).map(([difficulty, stats]) => (
{difficulty.toUpperCase()}
{stats.accuracy}%
{stats.correct}/{stats.questions} questions
))}
)}
) } return (
{/* Header with Stats */} {sessionStats && (
{sessionStats.total_questions}
Questions
{sessionStats.overall_accuracy}%
Accuracy
{sessionStats.current_difficulty}
Current Level
{sessionStats.consecutive_correct[sessionStats.current_difficulty]}
Streak
{sessionStats.model_available ? '🤖 AI Active' : '🔄 Fallback'}
)} {/* Last Result */} {lastResult && (
{lastResult.is_correct ? '✅ Correct!' : '❌ Incorrect'} {lastResult.difficulty_changed && ( Level: {lastResult.previous_difficulty} → {lastResult.new_difficulty} )}

{lastResult.explanation}

{lastResult.llm_prediction && (
🤖 AI predicted: {lastResult.llm_prediction.llm_prediction} {lastResult.llm_agrees ? ' ✅ (Agreed)' : ' ❌ (Disagreed)'} ({lastResult.llm_prediction.confidence * 100}% confidence)
)}
)} {/* Current Question */} {currentQuestion && (
{currentQuestion.difficulty.toUpperCase()} {currentQuestion.category}

{currentQuestion.question_text}

{/* AI Prediction */} {showPrediction && aiPrediction && (

🤖 AI Prediction

AI suggests: {aiPrediction.llm_prediction}

Confidence: {(aiPrediction.confidence * 100).toFixed(1)}% {aiPrediction.fallback_mode ? '(Fallback mode)' : '(CNN model)'}
)} {/* Answer Choices */}
{Object.entries(currentQuestion.choices).map(([letter, text]) => ( ))}
)}
) }