import 'school_identity.dart'; import 'school_term.dart'; import 'exam_schedule.dart'; enum UndergraduateExamType { finalExam(1, '期末考试'), midterm(2, '期中考试'), makeup(3, '补考/缓考'); const UndergraduateExamType(this.id, this.label); final int id; final String label; static UndergraduateExamType fromId(int id) => values.firstWhere( (t) => t.id == id, orElse: () => throw const FormatException('考试类型无效'), ); } class UndergraduateExamQuery { UndergraduateExamQuery({ required this.term, required Set types, }) : types = Set.unmodifiable(types) { if (term.school != SupportedSchool.uestcUndergraduate || types.isEmpty) { throw ArgumentError('请选择本科学期和考试类型'); } } final SchoolTerm term; final Set types; List get orderedTypes => UndergraduateExamType.values.where(types.contains).toList(); Uri uriFor(UndergraduateExamType type) { if (!types.contains(type)) throw ArgumentError('考试类型不在查询选项中'); return Uri.https( 'eams.uestc.edu.cn', '/eams/stdExamTable!examTable.action', {'semester.id': '${term.id}', 'examType.id': '${type.id}'}, ); } static UndergraduateExamQuery? fromSchedule(ExamSchedule? schedule) { if (schedule?.school != SupportedSchool.uestcUndergraduate) return null; return UndergraduateExamQuery( term: SchoolTerm(int.parse(schedule!.termId), school: schedule.school), types: schedule.requestedExamTypes .map(UndergraduateExamType.fromId) .toSet(), ); } }