import type { AngleSummary, AngleLabel } from "@/types"; import { CheckCircle2, XCircle } from "lucide-react"; interface CarAngleDiagramProps { summary: AngleSummary[]; } type PositionKey = | "Front View" | "Rear View" | "Driver Side View" | "Passenger Side View" | "Front Driver Side Corner View" | "Front Passenger Side Corner View" | "Rear Driver Side Corner View" | "Rear Passenger Side Corner View"; const POSITIONS: Record = { "Front View": { x: 180, y: 52, labelX: 180, labelY: 18, anchor: "middle" }, "Front Driver Side Corner View": { x: 72, y: 100, labelX: 20, labelY: 90, anchor: "middle" }, "Front Passenger Side Corner View": { x: 288, y: 100, labelX: 340, labelY: 90, anchor: "middle" }, "Driver Side View": { x: 42, y: 192, labelX: -18, labelY: 192, anchor: "end" }, "Passenger Side View": { x: 318, y: 192, labelX: 378, labelY: 192, anchor: "start" }, "Rear Driver Side Corner View": { x: 72, y: 284, labelX: 20, labelY: 296, anchor: "middle" }, "Rear Passenger Side Corner View": { x: 288, y: 284, labelX: 340, labelY: 296, anchor: "middle" }, "Rear View": { x: 180, y: 332, labelX: 180, labelY: 368, anchor: "middle" }, }; const SHORT: Record = { "Front View": ["Front"], "Rear View": ["Rear"], "Driver Side View": ["Driver", "Side"], "Passenger Side View": ["Passenger", "Side"], "Front Driver Side Corner View": ["Front-Left"], "Front Passenger Side Corner View": ["Front-Right"], "Rear Driver Side Corner View": ["Rear-Left"], "Rear Passenger Side Corner View": ["Rear-Right"], }; const summaryByAngle = (summary: AngleSummary[], angle: AngleLabel) => summary.find((s) => s.angle === angle); export function CarAngleDiagram({ summary }: CarAngleDiagramProps) { const detected = summary.filter((s) => s.detected).length; const total = summary.length; return (
{/* Score ring */}
0 ? "#f59e0b" : "#ef4444"} strokeWidth="8" strokeDasharray={`${(detected / total) * 201.06} 201.06`} strokeLinecap="round" className="transition-all duration-700" />
{detected} /{total}

{detected === total ? "All angles captured!" : detected === 0 ? "No angles detected" : `${detected} of ${total} angles found`}

{total - detected === 0 ? "Perfect coverage" : `${total - detected} angle${total - detected !== 1 ? "s" : ""} missing`}

{/* SVG Car Diagram */}
{/* Dashed guide lines from car center to angle points */} {(Object.keys(POSITIONS) as PositionKey[]).map((angle) => { const pos = POSITIONS[angle]; const s = summaryByAngle(summary, angle as AngleLabel); const color = s?.detected ? "#10b981" : "#ef4444"; return ( ); })} {/* Car top-down SVG silhouette */} {/* Car body */} {/* Hood */} {/* Trunk */} {/* Windshield */} {/* Rear windshield */} {/* Doors center line */} {/* Side mirrors */} {/* Wheels */} {/* Headlights */} {/* Tail lights */} {/* Direction arrow (front indicator) */} {/* Angle indicator dots + labels */} {(Object.keys(POSITIONS) as PositionKey[]).map((angle) => { const pos = POSITIONS[angle]; const s = summaryByAngle(summary, angle as AngleLabel); const detected = s?.detected ?? false; const color = detected ? "#10b981" : "#ef4444"; const bgColor = detected ? "rgba(16,185,129,0.15)" : "rgba(239,68,68,0.15)"; const lines = SHORT[angle]; return ( {/* Dot circle */} {detected ? ( ) : ( )} {/* Label */} {lines.map((line, i) => ( {line} ))} ); })}
{/* Legend */}
Detected
Missing
); }