'use client' import { useState, useEffect } from 'react' import { useParams, useRouter } from 'next/navigation' import Link from 'next/link' // Types interface WizardStep { number: number id: string title: string subtitle: string description: string icon: string is_required: boolean is_completed: boolean } interface FormData { [key: string]: any } const API_BASE = process.env.NEXT_PUBLIC_SDK_API_URL || 'http://localhost:8080' // Step icons mapping const stepIcons: Record = { 'document-text': ( ), 'academic-cap': ( ), 'server': ( ), 'document-report': ( ), 'currency-euro': ( ), 'calculator': ( ), 'calendar': ( ), 'document-download': ( ), } // Default wizard steps const defaultSteps: WizardStep[] = [ { number: 1, id: 'foerderprogramm', title: 'Foerderprogramm', subtitle: 'Programm & Grunddaten', description: 'Waehlen Sie das Foerderprogramm', icon: 'document-text', is_required: true, is_completed: false }, { number: 2, id: 'schulinformationen', title: 'Schulinformationen', subtitle: 'Schule & Traeger', description: 'Angaben zur Schule', icon: 'academic-cap', is_required: true, is_completed: false }, { number: 3, id: 'bestandsaufnahme', title: 'IT-Bestand', subtitle: 'Aktuelle Infrastruktur', description: 'IT-Bestandsaufnahme', icon: 'server', is_required: true, is_completed: false }, { number: 4, id: 'projektbeschreibung', title: 'Projektbeschreibung', subtitle: 'Ziele & Didaktik', description: 'Projektziele beschreiben', icon: 'document-report', is_required: true, is_completed: false }, { number: 5, id: 'investitionen', title: 'Investitionen', subtitle: 'Kostenaufstellung', description: 'Geplante Anschaffungen', icon: 'currency-euro', is_required: true, is_completed: false }, { number: 6, id: 'finanzierungsplan', title: 'Finanzierung', subtitle: 'Budget & Eigenanteil', description: 'Finanzierungsplan', icon: 'calculator', is_required: true, is_completed: false }, { number: 7, id: 'zeitplan', title: 'Zeitplan', subtitle: 'Laufzeit & Meilensteine', description: 'Projektlaufzeit planen', icon: 'calendar', is_required: true, is_completed: false }, { number: 8, id: 'abschluss', title: 'Abschluss', subtitle: 'Dokumente & Pruefung', description: 'Zusammenfassung', icon: 'document-download', is_required: true, is_completed: false }, ] export default function FoerderantragWizardPage() { const params = useParams() const router = useRouter() const applicationId = params.applicationId as string const [currentStep, setCurrentStep] = useState(1) const [steps, setSteps] = useState(defaultSteps) const [formData, setFormData] = useState({}) const [isSaving, setIsSaving] = useState(false) const [showAssistant, setShowAssistant] = useState(false) const [assistantMessage, setAssistantMessage] = useState('') const [assistantHistory, setAssistantHistory] = useState<{ role: string; content: string }[]>([]) const [isDemo, setIsDemo] = useState(false) useEffect(() => { // Check if this is a demo application if (applicationId.startsWith('demo-')) { setIsDemo(true) } loadApplication() }, [applicationId]) const loadApplication = async () => { // In production, load from API // For demo, use mock data } const handleFieldChange = (fieldId: string, value: any) => { setFormData(prev => ({ ...prev, [`step_${currentStep}`]: { ...prev[`step_${currentStep}`], [fieldId]: value, }, })) } const handleSaveStep = async () => { setIsSaving(true) try { // Save step data // Update step completion status setSteps(prev => prev.map(s => s.number === currentStep ? { ...s, is_completed: true } : s )) } finally { setIsSaving(false) } } const handleNextStep = async () => { await handleSaveStep() if (currentStep < 8) { setCurrentStep(prev => prev + 1) } } const handlePrevStep = () => { if (currentStep > 1) { setCurrentStep(prev => prev - 1) } } const handleAskAssistant = async () => { if (!assistantMessage.trim()) return const userMessage = assistantMessage setAssistantMessage('') setAssistantHistory(prev => [...prev, { role: 'user', content: userMessage }]) // Simulate assistant response setTimeout(() => { const response = getAssistantResponse(userMessage, currentStep) setAssistantHistory(prev => [...prev, { role: 'assistant', content: response }]) }, 1000) } const getAssistantResponse = (question: string, step: number): string => { // Simple response logic - in production, this calls the LLM API if (question.toLowerCase().includes('foerderquote')) { return 'Die Foerderquote im DigitalPakt 2.0 betraegt in der Regel 90%. Das bedeutet, dass 10% der Kosten als Eigenanteil vom Schultraeger zu tragen sind. In einigen Bundeslaendern gibt es Sonderregelungen fuer finanzschwache Kommunen.' } if (question.toLowerCase().includes('mep') || question.toLowerCase().includes('medienentwicklungsplan')) { return 'Der Medienentwicklungsplan (MEP) ist ein strategisches Dokument, das die paedagogischen und technischen Ziele der Schule fuer die Digitalisierung beschreibt. In den meisten Bundeslaendern ist ein MEP Voraussetzung fuer die Foerderung.' } if (question.toLowerCase().includes('foerderfahig')) { return 'Foerderfahig sind unter anderem: Netzwerkinfrastruktur, WLAN, Praesentationstechnik, Endgeraete (mit Einschraenkungen), Server und lokale KI-Systeme. Nicht foerderfahig sind: Verbrauchsmaterial, laufende Betriebskosten und Cloud-Abonnements ohne lokale Alternative.' } return `Ich helfe Ihnen gerne bei Schritt ${step}. Haben Sie eine konkrete Frage zu den Feldern in diesem Abschnitt? Sie koennen mich auch nach Formulierungshilfen oder Erklaerungen zu Fachbegriffen fragen.` } const renderStepContent = () => { const step = steps.find(s => s.number === currentStep) if (!step) return null switch (currentStep) { case 1: return case 2: return case 3: return case 4: return case 5: return case 6: return case 7: return case 8: return default: return null } } return (
{/* Header */}

Foerderantrag bearbeiten

Schritt {currentStep} von {steps.length}: {steps.find(s => s.number === currentStep)?.title}

{isDemo && ( Demo-Modus )}
{/* Progress Steps */}
{steps.map((step) => ( ))}
{/* Main Content */}
{/* Form Area */}
{/* Step Header */}
{stepIcons[steps.find(s => s.number === currentStep)?.icon || 'document-text']}

{steps.find(s => s.number === currentStep)?.title}

{steps.find(s => s.number === currentStep)?.description}

{/* Step Content */}
{renderStepContent()}
{/* Navigation */}
{/* Assistant Sidebar */} {showAssistant && (

KI-Assistent

Ich helfe bei Fragen

{/* Chat History */}
{assistantHistory.length === 0 && (

Stellen Sie mir Fragen zum aktuellen Schritt oder bitten Sie um Formulierungshilfen.

{['Was ist foerderfahig?', 'Erklaere die Foerderquote', 'Was ist ein MEP?'].map((q) => ( ))}
)} {assistantHistory.map((msg, idx) => (
{msg.content}
))}
{/* Input */}
setAssistantMessage(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleAskAssistant()} placeholder="Frage stellen..." className="flex-1 px-3 py-2 border border-slate-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" />
)}
) } // Step Components (simplified for now) function Step1Foerderprogramm({ formData, onChange }: { formData: FormData; onChange: (id: string, value: any) => void }) { return (

Die Grunddaten wurden bereits beim Erstellen des Antrags festgelegt. Sie koennen diese hier bei Bedarf anpassen.

Klicken Sie auf "Weiter" um mit den Schulinformationen fortzufahren.

) } function Step2Schulinformationen({ formData, onChange }: { formData: FormData; onChange: (id: string, value: any) => void }) { return (
) } function Step3Bestandsaufnahme({ formData, onChange }: { formData: FormData; onChange: (id: string, value: any) => void }) { return (
) } function Step4Projektbeschreibung({ formData, onChange }: { formData: FormData; onChange: (id: string, value: any) => void }) { return (