import { useCallback, useEffect, useRef, useState } from 'react'
import { useNavigate, useParams } from 'react-router-dom'
import {
type Assignment,
type Consultant,
type FeedbackDimension,
type FeedbackCategory,
type FeedbackCriterionItem,
type AssignmentFeedback,
type FeedbackCategoryRating,
type FeedbackDimensionText,
type FeedbackCategoryText,
type FeedbackRating,
type MeetingInstance,
type Assessment,
type ConversationEntry,
getAssignment, getConsultant,
loadFeedbackStructure,
listDoneMeetingsChronological,
listAssessmentsForMeetings, listConversationEntriesForMeetings,
getRatingTrendWeightStep,
getOrCreateAssignmentFeedback, updateAssignmentFeedback,
listFeedbackCategoryRatings, addFeedbackCategoryRating, updateFeedbackCategoryRating,
listFeedbackDimensionTexts, getFeedbackDimensionText, addFeedbackDimensionText, updateFeedbackDimensionText,
listFeedbackCategoryTexts, getFeedbackCategoryText, addFeedbackCategoryText, updateFeedbackCategoryText,
getFeedbackDimensionPrompt,
} from '../db'
import { RATING_OPTIONS, AI_CONFIG } from '../config/constants'
import { buildGroupMeetingScores, computeTrend, numberToRating, type TrendResult } from '../utils/ratingTrend'
import { buildDimensionPromptContext, renderDimensionPrompt, parseDimensionAiResponse } from '../utils/aiPrompt'
const ratingColor = (r: FeedbackRating | undefined) =>
RATING_OPTIONS.find(x => x.value === r)?.color ?? 'bg-gray-50 text-gray-400 border-gray-200'
const trendArrow = (trend: TrendResult['trend']) => {
if (trend === 'up') return ↑
if (trend === 'down') return ↓
return null
}
function getAiSettings() {
return {
apiKey: localStorage.getItem(AI_CONFIG.localStorageKeyApiKey) ?? '',
model: localStorage.getItem(AI_CONFIG.localStorageKeyModel) ?? AI_CONFIG.defaultModel,
}
}
function saveAiSettings(apiKey: string, model: string) {
localStorage.setItem(AI_CONFIG.localStorageKeyApiKey, apiKey)
localStorage.setItem(AI_CONFIG.localStorageKeyModel, model)
}
/** Klein gehaltene KI-Vorschlag-Box mit Übernehmen/Verwerfen — gleiche Bedienlogik überall im Feedback. */
function AiSuggestionBox({ text, onAccept, onDiscard }: { text: string; onAccept: () => void; onDiscard: () => void }) {
return (
✦ KI-Vorschlag
{text}
)
}
// ─── Komponente ───────────────────────────────────────────────────────────────
export default function AssignmentFeedbackPage() {
const { id, instituteeId } = useParams()
const navigate = useNavigate()
const assignmentId = Number(id)
const instId = Number(instituteeId)
const [assignment, setAssignment] = useState(null)
const [institutee, setInstitutee] = useState(null)
const [dimensions, setDimensions] = useState([])
const [categories, setCategories] = useState([])
const [items, setItems] = useState([])
const [feedback, setFeedback] = useState(null)
const [ratings, setRatings] = useState([])
const [dimTexts, setDimTexts] = useState([])
const [categoryTexts, setCategoryTexts] = useState([])
const [expanded, setExpanded] = useState>(new Set())
const [catTrends, setCatTrends] = useState