'use client' import { useState, useEffect, useCallback, useMemo } from 'react' import { useRouter } from 'next/navigation' import { elternApi, type ParentMeResponse, type ParentLesson } from '@/lib/eltern/api' import { translateSubject } from '@/lib/calendar/subject-i18n' const DAY_LABELS: Record = { de: ['Mo', 'Di', 'Mi', 'Do', 'Fr'], en: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], tr: ['Pzt', 'Sal', 'Çar', 'Per', 'Cum'], ar: ['الإثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'], uk: ['Пн', 'Вт', 'Ср', 'Чт', 'Пт'], ru: ['Пн', 'Вт', 'Ср', 'Чт', 'Пт'], pl: ['Pon', 'Wt', 'Śr', 'Czw', 'Pt'], fr: ['Lun', 'Mar', 'Mer', 'Jeu', 'Ven'], } const HEADINGS: Record = { de: { greeting: 'Willkommen', selectChild: 'Kind auswählen', period: 'Stunde', logout: 'Abmelden', noPlan: 'Noch kein Stundenplan veröffentlicht.' }, en: { greeting: 'Welcome', selectChild: 'Select child', period: 'Period', logout: 'Sign out', noPlan: 'No timetable published yet.' }, tr: { greeting: 'Hoş geldiniz', selectChild: 'Çocuk seç', period: 'Ders', logout: 'Çıkış', noPlan: 'Henüz ders programı yayımlanmadı.' }, ar: { greeting: 'مرحبًا', selectChild: 'اختر الطفل', period: 'حصة', logout: 'خروج', noPlan: 'لم يتم نشر جدول حصص بعد.' }, uk: { greeting: 'Ласкаво просимо', selectChild: 'Виберіть дитину', period: 'Урок', logout: 'Вийти', noPlan: 'Розклад ще не опубліковано.' }, ru: { greeting: 'Добро пожаловать', selectChild: 'Выберите ребёнка', period: 'Урок', logout: 'Выйти', noPlan: 'Расписание ещё не опубликовано.' }, pl: { greeting: 'Witamy', selectChild: 'Wybierz dziecko', period: 'Lekcja', logout: 'Wyloguj', noPlan: 'Plan lekcji nie jest jeszcze opublikowany.' }, fr: { greeting: 'Bienvenue', selectChild: 'Choisir un enfant', period: 'Cours', logout: 'Déconnexion', noPlan: 'Aucun emploi du temps publié.' }, } function t(lang: string, key: keyof typeof HEADINGS['de']): string { const code = (lang || 'de').slice(0, 2) return HEADINGS[code]?.[key] ?? HEADINGS.de[key] } export default function ElternPage() { const router = useRouter() const [me, setMe] = useState(null) const [selected, setSelected] = useState('') const [lessons, setLessons] = useState([]) const [error, setError] = useState(null) const lang = me?.parent.preferred_language || 'de' const dayLabels = DAY_LABELS[lang.slice(0, 2)] || DAY_LABELS.de const loadMe = useCallback(async () => { try { const data = await elternApi.me() setMe(data) if (data.children.length > 0) setSelected(data.children[0].tt_class_id) } catch (e) { // Not logged in → redirect to login. if (e instanceof Error && /session/i.test(e.message)) { router.replace('/eltern/login') return } setError(e instanceof Error ? e.message : 'Laden fehlgeschlagen') } }, [router]) useEffect(() => { loadMe() }, [loadMe]) const loadTimetable = useCallback(async () => { if (!selected) return try { const data = await elternApi.timetable(selected) setLessons(data || []) setError(null) } catch (e) { setError(e instanceof Error ? e.message : 'Stundenplan laden fehlgeschlagen') } }, [selected]) useEffect(() => { loadTimetable() }, [loadTimetable]) const periodIndices = useMemo(() => { const set = new Set() for (const l of lessons) set.add(l.PeriodIndex) return Array.from(set).sort((a, b) => a - b) }, [lessons]) const cell = (day: number, idx: number) => lessons.find(l => l.DayOfWeek === day && l.PeriodIndex === idx) const handleLogout = async () => { try { await elternApi.logout() } catch { /* ignore */ } router.replace('/eltern/login') } if (!me) { return (
{error ? {error} : Laedt …}
) } const activeChild = me.children.find(c => c.tt_class_id === selected) return (

{t(lang, 'greeting')}, {me.parent.email}

{activeChild ? `${activeChild.first_name} ${activeChild.last_name} · ${activeChild.class_name}` : ''}

{me.children.length > 1 && (
)} {error &&
{error}
} {periodIndices.length === 0 ? (
{t(lang, 'noPlan')}
) : (
{dayLabels.map(d => )} {periodIndices.map(idx => ( {[1, 2, 3, 4, 5].map(d => { const l = cell(d, idx) if (!l) return return ( ) })} ))}
{t(lang, 'period')}{d}
{idx}.
{translateSubject(l.SubjectName, lang)}
{l.TeacherName.split(',')[0]}
{l.RoomName &&
{l.RoomName}
}
)}
) }