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 RatingScore,
type MeetingInstance,
type Assessment,
type ConversationEntry,
getAssignment, getConsultant, getAssignmentType,
loadFeedbackStructure, resolveVisibleStructure,
listDoneMeetingsChronological,
listAssessmentsForMeetings, listConversationEntriesForMeetings,
listMeetingCategoryRatingsForMeetings,
getRatingTrendWeightStep,
getOrCreateAssignmentFeedback, updateAssignmentFeedback,
listFeedbackCategoryRatings, addFeedbackCategoryRating, updateFeedbackCategoryRating, deleteFeedbackCategoryRating,
listFeedbackDimensionTexts, getFeedbackDimensionText, addFeedbackDimensionText, updateFeedbackDimensionText,
listFeedbackCategoryTexts, getFeedbackCategoryText, addFeedbackCategoryText, updateFeedbackCategoryText,
getFeedbackDimensionPrompt,
getOrSeedDefaultCategoryPromptTemplate,
getOrSeedDefaultDimensionPromptTemplate,
} from '../db'
import {
AI_CONFIG, isValidRatingScore, resolveScoreStyle,
} from '../config/constants'
import { ScorePicker } from '../components/ScorePicker'
import { useRatingColorBands } from '../hooks/useRatingColorBands'
import { resolveCategoryChipScore } from '../utils/meetingCategoryScore'
import { computeTrend, numberToRating, type MeetingScorePoint, type TrendResult } from '../utils/ratingTrend'
import {
buildDimensionCondenseContext, buildCategoryPromptContext,
renderPrompt, parseCategoryAiResponse, parseDimensionCondenseResponse,
type CategoryCondenseEntry,
} from '../utils/aiPrompt'
import { getAiSettings, saveAiSettings, callOpenRouter } from '../utils/aiClient'
import { exportInstituteeFeedbackPdf } from '../utils/pdfExport'
const trendArrow = (trend: TrendResult['trend']) => {
if (trend === 'up') return ↑
if (trend === 'down') return ↓
return null
}
/** 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 colorBands = useRatingColorBands()
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