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()); } }