import '../core/utils/safe_convert.dart'; import 'attendance.dart'; import 'student.dart'; import 'timetable.dart'; class Announcement { final int id; final String name; final String date; final String summary; const Announcement({ required this.id, required this.name, required this.date, required this.summary, }); factory Announcement.fromJson(Map json) { return Announcement( id: SafeConvert.toSafeInt(json['id']), name: SafeConvert.toSafeString(json['name']), date: SafeConvert.toSafeString(json['date']), summary: SafeConvert.toSafeString(json['summary']), ); } } class DashboardExam { final int id; final String name; final String state; final String? startDate; const DashboardExam({ required this.id, required this.name, required this.state, this.startDate, }); factory DashboardExam.fromJson(Map json) { return DashboardExam( id: SafeConvert.toSafeInt(json['id']), name: SafeConvert.toSafeString(json['name']), state: SafeConvert.toSafeString(json['state'], 'scheduled'), startDate: SafeConvert.toNullableString(json['start_date']), ); } } class DashboardResult { final int id; final NamedRecord? exam; final double percentage; final String? grade; final String status; const DashboardResult({ required this.id, this.exam, required this.percentage, this.grade, required this.status, }); factory DashboardResult.fromJson(Map json) { return DashboardResult( id: SafeConvert.toSafeInt(json['id']), exam: NamedRecord.fromNullableJson(json['exam']), percentage: SafeConvert.toSafeDouble(json['percentage']), grade: SafeConvert.toNullableString(json['grade']), status: SafeConvert.toSafeString(json['status'], 'pass'), ); } } class DashboardStudent { final int id; final String fullName; final NamedRecord? program; const DashboardStudent({ required this.id, required this.fullName, this.program, }); factory DashboardStudent.fromJson(Map json) { return DashboardStudent( id: SafeConvert.toSafeInt(json['id']), fullName: SafeConvert.toSafeString(json['full_name']), program: NamedRecord.fromNullableJson(json['program']), ); } } class DashboardData { final DashboardStudent? student; final AttendanceSummary attendance; final List todayTimetable; final List upcomingExams; final List recentResults; final List announcements; const DashboardData({ this.student, required this.attendance, required this.todayTimetable, required this.upcomingExams, required this.recentResults, required this.announcements, }); factory DashboardData.fromJson(Map json) { final studentMap = SafeConvert.toNullableMap(json['student']); final attendanceMap = SafeConvert.toNullableMap(json['attendance']) ?? {}; return DashboardData( student: studentMap != null ? DashboardStudent.fromJson(studentMap) : null, attendance: AttendanceSummary.fromJson(attendanceMap), todayTimetable: SafeConvert.toSafeList( json['today_timetable'], (item) => TimetableSlot.fromJson(SafeConvert.toNullableMap(item) ?? {}), ), upcomingExams: SafeConvert.toSafeList( json['upcoming_exams'], (item) => DashboardExam.fromJson(SafeConvert.toNullableMap(item) ?? {}), ), recentResults: SafeConvert.toSafeList( json['recent_results'], (item) => DashboardResult.fromJson(SafeConvert.toNullableMap(item) ?? {}), ), announcements: SafeConvert.toSafeList( json['announcements'], (item) => Announcement.fromJson(SafeConvert.toNullableMap(item) ?? {}), ), ); } }