import type { Subject } from "~/types/api"; import { Link } from "react-router"; import { formatGradeBySystem, type GradeSystem } from "~/utils/gradeSystems"; import { calculateTargetProgress, getTargetStatusBgColor } from "~/utils/gradeCalculations"; interface SubjectCardProps { subject: Subject; averageGrade?: number; calculatedAverage?: number; gradeSystem?: string; onDelete?: () => void; } export function SubjectCard({ subject, averageGrade, calculatedAverage, gradeSystem, onDelete }: SubjectCardProps) { // Use provided gradeSystem, fallback to subject's own system const displaySystem = (gradeSystem || subject.grade_system || "percentage") as GradeSystem; // Calculate target progress if grade is available const targetProgress = averageGrade !== undefined ? calculateTargetProgress(subject.target_grade ?? averageGrade, subject) : null; const hasTaget = targetProgress && targetProgress.status !== "no-target"; const isOverridden = calculatedAverage !== undefined && averageGrade !== undefined && Math.abs(calculatedAverage - averageGrade) > 0.01; return (

{subject.name}

{subject.teacher && (

{subject.teacher}

)} {onDelete && ( )}
{averageGrade !== undefined && (
{formatGradeBySystem(averageGrade, displaySystem, 1)} {isOverridden && ( ({formatGradeBySystem(calculatedAverage!, displaySystem, 1)}) )}

Current Average

{hasTaget && (
Target: {formatGradeBySystem(targetProgress.targetPercentage, displaySystem, 1)}
{targetProgress.status === "above" && ( ✓ Above Target )} {targetProgress.status === "near" && ( → Near Target )} {targetProgress.status === "below" && ( ↓ Below Target )}
)}
)}

Grading Categories:

{subject.grading_categories.map((category, index) => ( {category.name} ({category.weight}%) ))}
); }