'use client' import { useState, useEffect, useCallback, useMemo } from 'react' import { useRouter } from 'next/navigation' import { useTheme } from '@/lib/ThemeContext' import { useLanguage } from '@/lib/LanguageContext' import { Sidebar } from '@/components/Sidebar' import { ThemeToggle } from '@/components/ThemeToggle' import { LanguageDropdown } from '@/components/LanguageDropdown' import { korrekturApi } from '@/lib/korrektur/api' // ============================================================================= // TYPES // ============================================================================= interface AbiturDokument { id: string dateiname: string fach: string jahr: number bundesland: string niveau: string dokumenttyp: string aufgabentyp?: string thema?: string download_url: string preview_url?: string file_size?: number page_count?: number } interface ThemaSuggestion { label: string count: number aufgabentyp: string kategorie?: string } // ============================================================================= // CONSTANTS // ============================================================================= // Default filter options (will be updated from API) const DEFAULT_FAECHER = ['Alle', 'Deutsch', 'Englisch', 'Mathematik', 'Geschichte', 'Politik'] const DEFAULT_JAHRE = ['Alle', '2025', '2024', '2023', '2022', '2021'] const BUNDESLAENDER = ['Alle', 'Niedersachsen', 'NRW', 'Bayern', 'Baden-Wuerttemberg', 'Hessen'] const DEFAULT_NIVEAUS = ['Alle', 'eA', 'gA'] const DEFAULT_DOKUMENTTYPEN = ['Alle', 'Aufgabe', 'Erwartungshorizont', 'Loesungshinweise'] const POPULAR_THEMES = [ 'Textanalyse', 'Gedichtanalyse', 'Eroerterung', 'Dramenanalyse', 'Sprachreflexion', 'Romantik', 'Expressionismus', ] // ============================================================================= // GLASS CARD COMPONENT // ============================================================================= interface GlassCardProps { children: React.ReactNode className?: string onClick?: () => void size?: 'sm' | 'md' | 'lg' delay?: number isDark?: boolean } function GlassCard({ children, className = '', onClick, size = 'md', delay = 0, isDark = true }: GlassCardProps) { const [isVisible, setIsVisible] = useState(false) const [isHovered, setIsHovered] = useState(false) useEffect(() => { const timer = setTimeout(() => setIsVisible(true), delay) return () => clearTimeout(timer) }, [delay]) const sizeClasses = { sm: 'p-4', md: 'p-5', lg: 'p-6' } return (
setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} onClick={onClick} > {children}
) } // ============================================================================= // FILTER DROPDOWN // ============================================================================= interface FilterDropdownProps { label: string value: string options: string[] onChange: (value: string) => void isDark: boolean } function FilterDropdown({ label, value, options, onChange, isDark }: FilterDropdownProps) { const inputId = `filter-${label.toLowerCase().replace(/\s+/g, '-')}` return (
) } // ============================================================================= // DOCUMENT CARD // ============================================================================= interface DokumentCardProps { dokument: AbiturDokument onPreview: () => void onUseAsTemplate: () => void delay?: number isDark: boolean } function DokumentCard({ dokument, onPreview, onUseAsTemplate, delay = 0, isDark }: DokumentCardProps) { const typeColor = dokument.dokumenttyp === 'Erwartungshorizont' ? '#22c55e' : '#3b82f6' return (
{/* Header */}

{dokument.fach} {dokument.jahr} {dokument.niveau}

{dokument.thema || dokument.aufgabentyp || dokument.dateiname}

{dokument.dokumenttyp === 'Erwartungshorizont' ? 'EH' : 'Aufgabe'}
{/* Meta */}
{dokument.bundesland} {dokument.page_count && {dokument.page_count} Seiten}
{/* Actions */}
) } // ============================================================================= // PREVIEW MODAL // ============================================================================= interface PreviewModalProps { dokument: AbiturDokument | null onClose: () => void onUseAsTemplate: () => void isDark: boolean } function PreviewModal({ dokument, onClose, onUseAsTemplate, isDark }: PreviewModalProps) { const [zoom, setZoom] = useState(100) if (!dokument) return null return (
{/* Backdrop */}
{/* Content */}
{/* PDF Viewer */}
{/* Toolbar */}
{zoom}%
{/* PDF Content */}
{dokument.preview_url ? (