File size: 1,667 Bytes
5a7d285
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

import type { generateMockExamQuestions } from '@/ai/flows/generate-mock-exam-questions';

export type AIProvider = 'gemini' | 'claude' | 'openai' | 'deepseek';

export type AIProviderSettings = {
  provider: AIProvider;
  apiKey: string;
};

export type ExamConfig = {
  exam: string;
  subjects?: string[];
  topic?: string;
  numberOfQuestions: number;
  difficulty: 'Easy' | 'Medium' | 'Hard' | 'Mixed';
  language: 'English' | 'Hindi' | 'Bilingual';
  suggestion?: string;
  timeLimit?: number; // in minutes
  negativeMarking: boolean;
  negativeMarkingRatio?: number;
};

export type UserConfiguration = {
  activeProvider: AIProvider;
  apiKey?: string;
};

export type Question = Awaited<ReturnType<typeof generateMockExamQuestions>>[0];

export type UserAnswer = {
  selectedOption: number | null;
  status: 'not-visited' | 'not-answered' | 'answered' | 'marked-for-review' | 'answered-and-marked-for-review';
};

export type TestSession = {
  id: string;
  userId?: string; // Make userId optional
  config: ExamConfig;
  questions: Question[];
  userAnswers: UserAnswer[];
  startTime: number;
  endTime?: number;
}

export type PerformanceBreakdown = {
  category: string;
  categoryType: 'subject' | 'topic';
  accuracy: number;
  correctCount: number;
  incorrectCount: number;
  skippedCount: number;
  totalCount: number;
};

export type TestResult = {
  id: string;
  userId: string;
  config: ExamConfig;
  score: number;
  accuracy: number;
  totalQuestions: number;
  correctAnswers: number;
  incorrectAnswers: number;
  skipped: number;
  takenAt: string;
  timeTaken: number; // in seconds
  performanceBreakdown?: PerformanceBreakdown[];
};