'use client'; import React, { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { BookOpen, Mail, Lock, User, ArrowRight, GraduationCap, Heart, Sparkles, Flower2, Eye, EyeOff, KeyRound, Info, Shield, Leaf, Users as UsersIcon, HelpCircle } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Checkbox } from '@/components/ui/checkbox'; import { Badge } from '@/components/ui/badge'; import { useAppStore } from '@/lib/store'; import { t } from '@/lib/i18n'; import { login, register } from '@/lib/api'; import { toast } from 'sonner'; type LoginRole = 'teacher' | 'student' | 'parent'; const DEMO_ACCOUNTS = [ { email: 'demo@competencetrack.org', password: 'Demo2025!', role: 'SCHOOL_ADMIN', labelKey: 'auth.demo_admin', icon: Shield, colorClass: 'from-emerald-400 to-emerald-600 hover:from-emerald-500 hover:to-emerald-700 shadow-emerald-300/40 dark:shadow-emerald-900/40' }, { email: 'demo.teacher@competencetrack.org', password: 'Demo2025!', role: 'TEACHER', labelKey: 'auth.demo_teacher', icon: GraduationCap, colorClass: 'from-teal-400 to-teal-600 hover:from-teal-500 hover:to-teal-700 shadow-teal-300/40 dark:shadow-teal-900/40' }, { email: 'demo.student@competencetrack.org', password: 'Demo2025!', role: 'STUDENT', labelKey: 'auth.demo_student', icon: User, colorClass: 'from-amber-400 to-amber-600 hover:from-amber-500 hover:to-amber-700 shadow-amber-300/40 dark:shadow-amber-900/40' }, { email: 'demo.parent@competencetrack.org', password: 'Demo2025!', role: 'PARENT', labelKey: 'auth.demo_parent', icon: Heart, colorClass: 'from-violet-400 to-violet-600 hover:from-violet-500 hover:to-violet-700 shadow-violet-300/40 dark:shadow-violet-900/40' }, ]; export default function AuthView() { const [mode, setMode] = useState<'login' | 'register'>('login'); const [loginRole, setLoginRole] = useState('teacher'); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [firstName, setFirstName] = useState(''); const [lastName, setLastName] = useState(''); const [schoolIdInput, setSchoolIdInput] = useState(''); const [loading, setLoading] = useState(false); const [demoLoading, setDemoLoading] = useState(false); const [showPassword, setShowPassword] = useState(false); const [rememberMe, setRememberMe] = useState(true); const [showForgotInfo, setShowForgotInfo] = useState(false); const setCurrentUser = useAppStore((s) => s.setCurrentUser); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); try { if (mode === 'login') { const user = await login(email, password); setCurrentUser(user); if (user.role === 'STUDENT') { toast.success(t('auth.student_welcome')); } else if (user.role === 'PARENT') { toast.success(t('auth.parent_welcome')); } else { toast.success(t('auth.welcome_back')); } } else { const user = await register({ email, password, firstName, lastName, }); setCurrentUser(user); toast.success(t('toast.created')); } } catch (err) { const message = err instanceof Error ? err.message : t('auth.error.generic'); if (message.includes('credentials') || message.includes('Invalid')) { toast.error(t('auth.error.invalid_credentials')); } else if (message.includes('already') || message.includes('registered')) { toast.error(t('auth.error.email_exists')); } else { toast.error(message); } } finally { setLoading(false); } }; const toggleMode = () => { setMode(mode === 'login' ? 'register' : 'login'); setEmail(''); setPassword(''); setFirstName(''); setLastName(''); setSchoolIdInput(''); }; const handleDemoLogin = async (demoEmail: string, demoPassword: string) => { setDemoLoading(true); setMode('login'); setEmail(demoEmail); setPassword(demoPassword); try { const user = await login(demoEmail, demoPassword); setCurrentUser(user); if (user.role === 'STUDENT') { toast.success(t('auth.student_welcome')); } else if (user.role === 'PARENT') { toast.success(t('auth.parent_welcome')); } else { toast.success(t('auth.welcome_back')); } } catch (err) { const message = err instanceof Error ? err.message : t('auth.error.generic'); if (message.includes('credentials') || message.includes('Invalid')) { toast.error(t('auth.error.invalid_credentials')); } else { toast.error(message); } } finally { setDemoLoading(false); } }; // Role tab config const roleTabs: Array<{ key: LoginRole; icon: React.ElementType; labelKey: string; color: string; activeColor: string; bgGradient: string }> = [ { key: 'teacher', icon: GraduationCap, labelKey: 'auth.login', color: 'text-emerald-600 dark:text-emerald-400', activeColor: 'bg-emerald-500 text-white', bgGradient: 'from-emerald-50/50 to-teal-50/50 dark:from-emerald-950/10 dark:to-teal-950/10' }, { key: 'student', icon: UsersIcon, labelKey: 'auth.student_login', color: 'text-amber-600 dark:text-amber-400', activeColor: 'bg-amber-500 text-white', bgGradient: 'from-amber-50/50 to-orange-50/50 dark:from-amber-950/10 dark:to-orange-950/10' }, { key: 'parent', icon: Heart, labelKey: 'auth.parent_login', color: 'text-violet-600 dark:text-violet-400', activeColor: 'bg-violet-500 text-white', bgGradient: 'from-violet-50/50 to-purple-50/50 dark:from-violet-950/10 dark:to-purple-950/10' }, ]; const activeRoleTab = roleTabs.find((r) => r.key === loginRole)!; return (
{/* Animated floating geometric shapes background */}
{/* Left illustration side (hidden on small screens) */}
{/* Main icon changes based on login role */} {loginRole === 'teacher' && } {loginRole === 'student' && } {loginRole === 'parent' && }
{/* Feature highlights */}

{t('auth.mission_title')}

{t('auth.feature_competencies')}

{t('auth.feature_student_centered')}

{t('auth.feature_open_source')}

{t('auth.feature_reports')}

{t('auth.feature_flower')}

{/* Mockup dashboard preview */}
{[0, 1, 2, 3, 4, 5].map((i) => (
))}
{/* Auth form */} {/* Branding */}

{t('app.name')}

{t('app.subtitle')}

{/* Auth Card */} {/* Role tabs */}
{roleTabs.map((tab) => ( ))}
{loginRole === 'teacher' ? (mode === 'login' ? t('auth.login') : t('auth.register_title')) : loginRole === 'student' ? t('auth.student_login') : t('auth.parent_login')}

{loginRole === 'teacher' ? (mode === 'login' ? t('auth.login_subtitle') : t('auth.register_subtitle')) : loginRole === 'student' ? t('auth.student_login_desc') : t('auth.parent_login_desc')}

{/* Name fields for register (teacher only) */} {mode === 'register' && loginRole === 'teacher' && (
setFirstName(e.target.value)} className="pl-10 h-12 min-h-[44px] border-emerald-200/50 dark:border-emerald-900/30 focus:border-emerald-400 focus:ring-emerald-400/20 text-base" placeholder={t('auth.firstName')} required />
setLastName(e.target.value)} className="h-12 min-h-[44px] border-emerald-200/50 dark:border-emerald-900/30 focus:border-emerald-400 focus:ring-emerald-400/20 text-base" placeholder={t('auth.lastName')} required />
)} {/* Student-specific: School ID field */} {loginRole === 'student' && (
setSchoolIdInput(e.target.value)} className="pl-10 h-12 min-h-[44px] border-amber-200/50 dark:border-amber-900/30 focus:border-amber-400 focus:ring-amber-400/20 text-base" placeholder={t('auth.school_id')} />
)} {/* Parent-specific: name fields on login */} {loginRole === 'parent' && mode === 'login' && (

{t('auth.parent_login_desc')}

)}
{/* Email field (always shown) */}
setEmail(e.target.value)} className={`pl-10 h-12 min-h-[44px] border-emerald-200/50 dark:border-emerald-900/30 focus:border-emerald-400 focus:ring-emerald-400/20 text-base ${ loginRole === 'student' ? 'focus:border-amber-400 focus:ring-amber-400/20' : loginRole === 'parent' ? 'focus:border-violet-400 focus:ring-violet-400/20' : '' }`} placeholder={loginRole === 'student' ? 'name@schule.de' : loginRole === 'parent' ? 'parent@email.de' : 'name@schule.de'} required />
{/* Password field */}
{mode === 'login' && ( )}
setPassword(e.target.value)} className="pl-9 pr-10 border-emerald-200/50 dark:border-emerald-900/30 focus:border-emerald-400 focus:ring-emerald-400/20" placeholder="••••••" minLength={6} required />
{/* Forgot Password info */} {showForgotInfo && (

{loginRole === 'student' ? (t('polish.demo_email') + ': demo.student@competencetrack.org / ' + t('polish.demo_password') + ': Demo2025!') : loginRole === 'parent' ? (t('polish.demo_email') + ': demo.parent@competencetrack.org / ' + t('polish.demo_password') + ': Demo2025!') : (t('polish.demo_email') + ': demo@competencetrack.org / ' + t('polish.demo_password') + ': Demo2025!') }

)}
{/* Remember me (login mode only) */} {mode === 'login' && (
setRememberMe(v === true)} className="border-emerald-300 dark:border-emerald-700 data-[state=checked]:bg-emerald-500 data-[state=checked]:border-emerald-500" />
)} {/* Submit button */}
{/* Role-specific demo login buttons */} {mode === 'login' && (

{t('auth.demo_section_title')}

{t('badge.demo')}

{t('auth.demo_section_subtitle')}

{DEMO_ACCOUNTS.map((demo) => ( ))}
)} {/* Toggle register/login (only for teacher role) */} {loginRole === 'teacher' && (
)} {/* Student info: accounts created by teachers */} {loginRole === 'student' && mode === 'login' && (

{t('auth.create_student_account')} — {t('auth.student_login_desc')}

{/* Jugendschutz notice for students */}

{t('dsgvo.jugendschutz_login_notice')}

)} {/* Parent info */} {loginRole === 'parent' && mode === 'login' && (

{t('parent.my_children')} — {t('auth.parent_login_desc')}

)}
{/* Footer */}

{t('app.tagline')}

); }