import React, { useState } from 'react'; import { Sparkles, BookOpen, Clock, Target, Loader2, CheckCircle, ArrowRight, Settings, Zap, AlertCircle } from 'lucide-react'; import { AIEnhancedWikimedia } from '../utils/ai-enhanced-wikimedia'; import { AIProviderManager } from '../utils/ai-providers'; import { StudyPlan } from '../types'; interface AIStudyPlanGeneratorProps { onPlanGenerated: (plan: StudyPlan) => void; } const AIStudyPlanGenerator: React.FC = ({ onPlanGenerated }) => { const [topic, setTopic] = useState(''); const [difficulty, setDifficulty] = useState<'beginner' | 'intermediate' | 'advanced'>('beginner'); const [loading, setLoading] = useState(false); const [generatedPlan, setGeneratedPlan] = useState(null); const [useAI, setUseAI] = useState(true); const [aiStatus, setAiStatus] = useState<'checking' | 'available' | 'unavailable'>('checking'); const [showAIConfig, setShowAIConfig] = useState(false); React.useEffect(() => { checkAIAvailability(); }, []); const checkAIAvailability = async () => { setAiStatus('checking'); try { const config = AIProviderManager.getConfig(); // Check if any provider is configured if (!config.selectedProvider) { setAiStatus('unavailable'); return; } // For providers that require API keys, check if key exists const provider = AIProviderManager.getProviderById(config.selectedProvider); if (provider?.requiresApiKey) { const hasApiKey = config.apiKeys && config.apiKeys[config.selectedProvider]; if (!hasApiKey) { setAiStatus('unavailable'); return; } } // Test actual connection const isAvailable = await AIProviderManager.testConnection(config.selectedProvider); setAiStatus(isAvailable ? 'available' : 'unavailable'); } catch (error) { console.error('AI availability check failed:', error); setAiStatus('unavailable'); } }; const handleGenerate = async () => { if (!topic.trim()) return; setLoading(true); try { let plan: StudyPlan; if (useAI && aiStatus === 'available') { // Use AI-enhanced generation plan = await AIEnhancedWikimedia.generateEnhancedStudyPlan(topic, difficulty); } else { // Use standard Wikimedia-based generation plan = await AIEnhancedWikimedia.generateStudyPlan(topic, difficulty); } setGeneratedPlan(plan); } catch (error) { console.error('Failed to generate study plan:', error); } finally { setLoading(false); } }; const handleAcceptPlan = () => { if (generatedPlan) { onPlanGenerated(generatedPlan); setGeneratedPlan(null); setTopic(''); } }; const getDifficultyColor = (level: string) => { switch (level) { case 'beginner': return 'bg-success-100 text-success-800'; case 'intermediate': return 'bg-warning-100 text-warning-800'; case 'advanced': return 'bg-error-100 text-error-800'; default: return 'bg-gray-100 text-gray-800'; } }; const getAIStatusMessage = () => { const config = AIProviderManager.getConfig(); const provider = AIProviderManager.getProviderById(config.selectedProvider); switch (aiStatus) { case 'checking': return 'Testing connection to configured AI provider...'; case 'available': return `Using ${provider?.name || 'AI'} for enhanced study plan generation`; case 'unavailable': if (!config.selectedProvider) { return 'No AI provider configured. Click "Configure AI" to set up open-source AI.'; } if (provider?.requiresApiKey && !config.apiKeys?.[config.selectedProvider]) { return `${provider.name} requires an API key. Click "Configure AI" to add it.`; } return `Cannot connect to ${provider?.name || 'AI provider'}. Using Wikimedia content analysis instead.`; default: return 'Checking AI availability...'; } }; return (

AI Study Plan Generator

Create personalized learning paths from Wikimedia content

{/* AI Status Banner */}
{aiStatus === 'checking' && } {aiStatus === 'available' && } {aiStatus === 'unavailable' && }
{aiStatus === 'checking' && 'Checking AI Availability...'} {aiStatus === 'available' && 'AI Enhancement Available'} {aiStatus === 'unavailable' && 'AI Enhancement Unavailable'}
{getAIStatusMessage()}
{aiStatus === 'unavailable' && ( )}
{aiStatus === 'available' && ( )}
{!generatedPlan ? (
setTopic(e.target.value)} placeholder="e.g., Machine Learning, Ancient History, Climate Science..." className="w-full px-4 py-3 border border-gray-300 rounded-xl focus:ring-2 focus:ring-primary-500 focus:border-transparent text-lg" onKeyDown={(e) => e.key === 'Enter' && handleGenerate()} />
{(['beginner', 'intermediate', 'advanced'] as const).map((level) => ( ))}
{/* Quick Setup Guide */} {aiStatus === 'unavailable' && (

🚀 Quick AI Setup

Option 1 (Privacy):

Install Ollama locally for complete privacy

• Download from ollama.ai

• Run: ollama pull llama3.2

Option 2 (Cloud):

Get free Hugging Face API key

• Sign up at huggingface.co

• Add key in AI configuration

)}
) : (

{generatedPlan.title}

{useAI && aiStatus === 'available' && ( AI Enhanced )}

{generatedPlan.description}

{generatedPlan.difficulty}
{generatedPlan.estimatedTime}
{generatedPlan.topics.length} topics

Study Topics:

{generatedPlan.topics.slice(0, 5).map((topic, index) => (
{index + 1}
{topic.title}
{topic.estimatedTime}
))} {generatedPlan.topics.length > 5 && (
+{generatedPlan.topics.length - 5} more topics...
)}
)}
); }; export default AIStudyPlanGenerator;