/** * Exam-marker types — mirror the FastAPI /api/exam contract (see api routers/exam/schemas.py). * Supabase is source of truth for this operational data; the graph (cc.public.exams) joins by * the shared UUIDs (template/question/region ids, exam_code). */ export type ExamTemplateStatus = 'draft' | 'ready' | 'archived'; export interface ExamTemplate { id: string; title: string; subject: string | null; exam_id: string | null; exam_code: string | null; source_file_id: string | null; page_count: number | null; institute_id: string; teacher_id: string; status: ExamTemplateStatus; created_at: string; updated_at: string; } export interface CreateTemplatePayload { title: string; subject?: string; exam_id?: string; exam_code?: string; source_file_id?: string; page_count?: number; institute_id?: string; } /** Canvas children (used from S4-9 onward; defined here so the seam is complete). */ export interface ExamQuestion { id: string; template_id: string; parent_id: string | null; label: string; order: number; max_marks: number; answer_type: string | null; mcq_options: unknown | null; mark_scheme: Record; is_container: boolean; spec_ref: string | null; } export interface ExamResponseArea { id: string; question_id: string; template_id: string; page: number; bounds: Record; kind: 'response' | 'context'; response_form: string | null; source: 'manual' | 'ai'; confirmed: boolean; confidence: number | null; } export interface ExamBoundary { id: string; template_id: string; question_id: string | null; label: string | null; page_index: number; y: number; bounds: Record | null; source: 'manual' | 'ai'; confirmed: boolean; } export interface ExamTemplateDetail extends ExamTemplate { questions: ExamQuestion[]; response_areas: ExamResponseArea[]; boundaries: ExamBoundary[]; }