'use client' // ============================================================================= // Types // ============================================================================= export type StepStatus = 'pending' | 'active' | 'completed' | 'failed' export interface WizardStep { id: string name: string icon: string status: StepStatus testable?: boolean } export interface TestResult { name: string status: 'passed' | 'failed' | 'pending' message: string details?: string } // ============================================================================= // Constants // ============================================================================= export const BACKEND_URL = process.env.NEXT_PUBLIC_BACKEND_URL || 'http://localhost:8000' export const GAME_URL = process.env.NEXT_PUBLIC_GAME_URL || 'http://localhost:3001' export const STEPS: WizardStep[] = [ { id: 'welcome', name: 'Willkommen', icon: '🎮', status: 'pending' }, { id: 'overview', name: 'Dashboard Uebersicht', icon: '📊', status: 'pending' }, { id: 'stats', name: 'Statistiken', icon: '📈', status: 'pending' }, { id: 'leaderboard', name: 'Leaderboard', icon: '🏆', status: 'pending' }, { id: 'webgl', name: 'WebGL Embedding', icon: '🎯', status: 'pending', testable: true }, { id: 'api', name: 'API Integration', icon: '🔌', status: 'pending', testable: true }, { id: 'quiz', name: 'Quiz-System', icon: '❓', status: 'pending' }, { id: 'learning', name: 'Lernniveau', icon: '📚', status: 'pending' }, { id: 'summary', name: 'Zusammenfassung', icon: '✅', status: 'pending' }, ] export const EDUCATION_CONTENT: Record = { 'welcome': { title: 'Willkommen bei Breakpilot Drive!', content: [ 'Breakpilot Drive ist ein **Endless Runner Lernspiel** fuer Schueler der Klassen 2-6.', 'Das Spiel kombiniert Spielspass mit Lernen:', '• Fahre so weit wie moeglich', '• Beantworte Quiz-Fragen um Punkte zu sammeln', '• Das System passt sich automatisch an dein Lernniveau an', 'In diesem Wizard lernst du alle Admin-Features kennen und testest die Integration.', ], tips: [ 'Das Spiel laeuft auf Port 3001 als Unity WebGL Build', 'Die API-Endpoints sind unter /api/game/* verfuegbar', ], }, 'overview': { title: 'Das Game Dashboard', content: [ 'Das Dashboard unter **/admin/game** bietet drei Hauptbereiche:', '**1. Uebersicht-Tab:**', '• Statistik-Karten mit KPIs (Spieler, Sessions, Genauigkeit)', '• Top 5 Leaderboard', '• Schnellzugriff-Buttons', '**2. Spielen-Tab:**', '• Embedded WebGL Game im iframe', '• Direkt im Admin-Panel spielbar', '**3. Statistiken-Tab:**', '• Genauigkeit nach Fach', '• Aktivitaets-Feed', '• Lernniveau-Verteilung', ], tips: [ 'Die Tabs sind oben im Dashboard als Buttons sichtbar', 'Klicke auf "Aktualisieren" um die neuesten Daten zu laden', ], }, 'stats': { title: 'Statistiken verstehen', content: [ 'Die Statistik-Karten zeigen wichtige KPIs:', '**Aktive Spieler heute:** Anzahl der Spieler mit mindestens einer Session heute', '**Spielsessions:** Gesamtzahl aller abgeschlossenen Spielsessions', '**Quiz-Fragen beantwortet:** Kumulative Anzahl beantworteter Fragen', '**Durchschnittliche Genauigkeit:** Prozent der richtig beantworteten Fragen', '**Gesamte Spielzeit:** Summe aller Spielzeiten in Stunden', 'Trends zeigen die Veraenderung zur Vorwoche.', ], tips: ['Gruene Trends = Verbesserung', 'Rote Trends = Bereich mit Aufmerksamkeitsbedarf'], }, 'leaderboard': { title: 'Leaderboard & Gamification', content: [ 'Das Leaderboard motiviert Schueler durch:', '**Ranking:** Top 5 Spieler nach Gesamtpunktzahl', '**Goldene Medaille:** Platz 1 ist besonders hervorgehoben', '**Genauigkeit:** Zeigt wie viele Fragen richtig beantwortet wurden', 'Spaeter kommen hinzu:', '• Klassen-Ranglisten', '• Wochen/Monats-Ranglisten', '• Achievements & Badges', ], tips: ['Leaderboards koennen pro Klasse oder schulweit sein', 'Datenschutz: Nur Vornamen + erster Buchstabe des Nachnamens werden gezeigt'], }, 'webgl': { title: 'WebGL Embedding', content: [ 'Das Spiel wird als **Unity WebGL Build** eingebettet:', '**Technologie:**', '• Unity 6 (Version 6000.0)', '• Universal Render Pipeline (URP)', '• WebAssembly (WASM) fuer Performance', '**Embedding:**', '• Das Spiel laeuft in einem iframe auf Port 3001', '• Parameter wie ?embed=true optimieren fuer Einbettung', '• Fullscreen und Gamepad werden unterstuetzt', '**Wichtig:** Der Game-Container muss laufen:', '`docker-compose --profile game up -d`', ], tips: ['Bei Ladefehlern: Container-Status pruefen', 'CORS muss korrekt konfiguriert sein'], }, 'api': { title: 'API Integration', content: [ 'Die Game API stellt folgende Endpoints bereit:', '**GET /api/game/learning-level**', '→ Aktuelles Lernniveau des Spielers', '**GET /api/game/questions?difficulty=3&count=5**', '→ Quiz-Fragen basierend auf Schwierigkeit', '**POST /api/game/session**', '→ Spielsession speichern (Score, Zeit, Antworten)', '**GET /api/game/achievements**', '→ Freigeschaltete Achievements', '**GET /api/game/leaderboard?limit=10**', '→ Top-Spieler Rangliste', ], tips: ['Alle Endpoints erfordern JWT-Token in Produktion', 'Im Dev-Modus ist Auth optional'], }, 'quiz': { title: 'Das Quiz-System', content: [ 'Quiz-Fragen erscheinen waehrend des Spiels:', '**Quick-Modus (5 Sekunden):**', '• 2-3 Antwortmoeglichkeiten', '• Wird durch visuelle Trigger ausgeloest (Bruecke, Baum)', '• Schnelle Punkte bei richtiger Antwort', '**Pause-Modus (unbegrenzt):**', '• 4 Antwortmoeglichkeiten', '• Spieler kann nachdenken', '• Mehr Punkte moeglich', '**Faecher:** Mathematik, Deutsch, Englisch', '**LLM-Generierung:** Fragen werden dynamisch erstellt', ], tips: ['Fragen werden im Valkey-Cache gespeichert', 'Schwierigkeit passt sich automatisch an'], }, 'learning': { title: 'Adaptives Lernniveau', content: [ 'Das System passt sich automatisch an:', '**5 Lernstufen:**', '• Level 1: Klasse 2-3 (Beginner)', '• Level 2: Klasse 3-4 (Elementary)', '• Level 3: Klasse 4-5 (Intermediate)', '• Level 4: Klasse 5-6 (Advanced)', '• Level 5: Klasse 6+ (Expert)', '**Anpassung:**', '• ≥80% richtig ueber 10 Fragen → Level Up', '• <40% richtig ueber 5 Fragen → Level Down', '• Schwache Faecher werden identifiziert', '**State Engine:** Nutzt die bestehende Breakpilot State Machine', ], tips: ['Eltern sehen das Niveau ihrer Kinder im Dashboard', 'Lehrer sehen Klassen-Durchschnitte'], }, 'summary': { title: 'Zusammenfassung', content: [ 'Du hast alle Breakpilot Drive Features kennengelernt:', '✅ Dashboard mit Uebersicht, Spielen, Statistiken', '✅ Statistik-Karten und KPIs', '✅ Leaderboard & Gamification', '✅ WebGL Embedding', '✅ API Integration', '✅ Quiz-System mit Quick/Pause-Modus', '✅ Adaptives Lernniveau', '**Naechste Schritte:**', '• Teste das Dashboard unter /admin/game', '• Starte den Game-Container', '• Spiele eine Runde im "Spielen"-Tab', ], tips: ['Bei Fragen: Siehe docs/breakpilot-drive/README.md', 'API-Doku: docs/breakpilot-drive/architecture.md'], }, } // ============================================================================= // WizardStepper // ============================================================================= export function WizardStepper({ steps, currentStep, onStepClick }: { steps: WizardStep[] currentStep: number onStepClick: (index: number) => void }) { return (
{steps.map((step, index) => (
{index < steps.length - 1 && (
)}
))}
) } // ============================================================================= // EducationCard // ============================================================================= export function EducationCard({ stepId }: { stepId: string }) { const content = EDUCATION_CONTENT[stepId] if (!content) return null return (

📖 {content.title}

{content.content.map((line, index) => (

$1') .replace(/`(.*?)`/g, '$1') }} /> ))}

{content.tips && content.tips.length > 0 && (

💡 Tipps:

{content.tips.map((tip, index) => (

• {tip}

))}
)}
) } // ============================================================================= // TestResultCard // ============================================================================= export function TestResultCard({ results }: { results: TestResult[] }) { return (

Test-Ergebnisse

{results.map((result, index) => (
{result.status === 'passed' ? '✓' : result.status === 'failed' ? '✗' : '○'}

{result.name}

{result.message}

{result.details && ( {result.details} )}
))}
) } // ============================================================================= // InteractiveDemo // ============================================================================= export function InteractiveDemo({ stepId }: { stepId: string }) { if (stepId === 'stats') { return (

Live-Vorschau: Statistik-Karten

{[ { label: 'Aktive Spieler', value: '42', icon: '👥', color: 'blue' }, { label: 'Genauigkeit', value: '78%', icon: '✓', color: 'green' }, { label: 'Spielzeit', value: '156h', icon: '⏱️', color: 'purple' }, ].map((stat) => (
{stat.icon}

{stat.value}

{stat.label}

))}
) } if (stepId === 'leaderboard') { return (

Live-Vorschau: Leaderboard

{[ { rank: 1, name: 'Max M.', score: 25000, color: 'yellow' }, { rank: 2, name: 'Lisa K.', score: 23500, color: 'slate' }, { rank: 3, name: 'Tim S.', score: 21000, color: 'orange' }, ].map((entry) => (
{entry.rank} {entry.name}
{entry.score.toLocaleString()} Punkte
))}
) } if (stepId === 'learning') { return (

Live-Vorschau: Lernniveau

{[ { subject: 'Mathematik', level: 3.2, color: 'blue' }, { subject: 'Deutsch', level: 2.8, color: 'green' }, { subject: 'Englisch', level: 3.5, color: 'purple' }, ].map((item) => (
{item.subject} Level {item.level.toFixed(1)}
))}
) } return null }