'use client' import React, { useState, useEffect } from 'react' import { useParams, useRouter } from 'next/navigation' import Link from 'next/link' import { AssessmentResultCard } from '@/components/sdk/use-case-assessment/AssessmentResultCard' interface TriggeredRule { code: string category: string title: string description: string severity: string score_delta: number gdpr_ref: string } interface RequiredControl { id: string title: string description: string severity: string category: string gdpr_ref: string } interface PatternRecommendation { pattern_id: string title: string description: string rationale: string priority: number } interface ForbiddenPattern { pattern_id: string title: string description: string reason: string } interface FullAssessment { id: string title: string tenant_id: string domain: string created_at: string intake?: { use_case_text?: string [key: string]: unknown } // Flat result fields feasibility: string risk_level: string risk_score: number complexity: string dsfa_recommended: boolean art22_risk: boolean training_allowed: string triggered_rules?: TriggeredRule[] required_controls?: RequiredControl[] recommended_architecture?: PatternRecommendation[] forbidden_patterns?: ForbiddenPattern[] explanation_text?: string explanation_model?: string explanation_generated_at?: string policy_version: string } export default function AssessmentDetailPage() { const params = useParams() const router = useRouter() const assessmentId = params.id as string const [assessment, setAssessment] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [explaining, setExplaining] = useState(false) const [explanationError, setExplanationError] = useState(null) async function loadAssessment() { const response = await fetch(`/api/sdk/v1/ucca/assessments/${assessmentId}`) if (!response.ok) throw new Error('Assessment nicht gefunden') return response.json() } useEffect(() => { if (!assessmentId) return loadAssessment() .then(data => setAssessment(data)) .catch(() => { // Fallback: fetch from list fetch('/api/sdk/v1/ucca/assessments') .then(r => r.json()) .then(data => { const found = (data.assessments || []).find((a: FullAssessment) => a.id === assessmentId) if (found) { setAssessment(found) setError(null) } else { setError('Assessment nicht gefunden') } }) .catch(() => setError('Fehler beim Laden')) }) .finally(() => setLoading(false)) }, [assessmentId]) const handleDelete = async () => { if (!confirm('Assessment wirklich loeschen?')) return try { await fetch(`/api/sdk/v1/ucca/assessments/${assessmentId}`, { method: 'DELETE' }) router.push('/sdk/use-cases') } catch { // Ignore delete errors } } const handleExplain = async () => { setExplaining(true) setExplanationError(null) try { const res = await fetch(`/api/sdk/v1/ucca/assessments/${assessmentId}/explain`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ language: 'de' }), }) if (!res.ok) throw new Error('Fehler bei der Erklärung') // Reload assessment to get updated explanation_text const updated = await fetch(`/api/sdk/v1/ucca/assessments/${assessmentId}`) setAssessment(await updated.json()) } catch (err) { setExplanationError(err instanceof Error ? err.message : 'Fehler') } finally { setExplaining(false) } } if (loading) { return (
Lade Assessment...
) } if (error || !assessment) { return (

Fehler

{error || 'Assessment nicht gefunden'}

Zurueck zur Uebersicht
) } // Build result object for AssessmentResultCard from flat assessment fields const resultForCard = { feasibility: assessment.feasibility, risk_level: assessment.risk_level, risk_score: assessment.risk_score, complexity: assessment.complexity, dsfa_recommended: assessment.dsfa_recommended, art22_risk: assessment.art22_risk, training_allowed: assessment.training_allowed, // AssessmentResultCard expects rule_code; backend stores code — map here triggered_rules: assessment.triggered_rules?.map(r => ({ rule_code: r.code, title: r.title, severity: r.severity, gdpr_ref: r.gdpr_ref, })), required_controls: assessment.required_controls?.map(c => ({ id: c.id, title: c.title, description: c.description, effort: c.category, })), recommended_architecture: assessment.recommended_architecture?.map(p => ({ id: p.pattern_id, title: p.title, description: p.description, benefit: p.rationale, })), summary: '', recommendation: '', } return (
{/* Breadcrumb */}
Use Cases / {assessment.title || assessmentId.slice(0, 8)}
{/* Header */}

{assessment.title || 'Assessment Detail'}

Domain: {assessment.domain} Erstellt: {new Date(assessment.created_at).toLocaleDateString('de-DE')}
↓ Markdown ↓ JSON Bearbeiten Zurueck
{/* Explanation error */} {explanationError && (
{explanationError}
)} {/* Use Case Text */} {assessment.intake?.use_case_text && (

Beschreibung des Anwendungsfalls

{assessment.intake.use_case_text as string}

)} {/* Result */} [0]['result']} /> {/* KI-Erklärung */} {assessment.explanation_text && (

KI-Erklärung

{assessment.explanation_model && ( via {assessment.explanation_model} )}

{assessment.explanation_text}

)}
) }