import 'package:flutter_bloc/flutter_bloc.dart'; import '../../core/utils/app_logger.dart'; import '../../data/models/subject_model.dart'; import '../../data/repositories/curriculum_repository.dart'; abstract class CurriculumState {} class CurriculumInitial extends CurriculumState {} class CurriculumLoading extends CurriculumState {} class CurriculumLoaded extends CurriculumState { final List subjects; final List filteredSubjects; final List availableGrades; final String selectedGrade; final String selectedStream; final String searchQuery; final SubjectModel? activeSubject; CurriculumLoaded({ required this.subjects, required this.filteredSubjects, this.availableGrades = const [], this.selectedGrade = 'grade_10', this.selectedStream = 'scientific', this.searchQuery = '', this.activeSubject, }); CurriculumLoaded copyWith({ List? subjects, List? filteredSubjects, List? availableGrades, String? selectedGrade, String? selectedStream, String? searchQuery, SubjectModel? activeSubject, }) { return CurriculumLoaded( subjects: subjects ?? this.subjects, filteredSubjects: filteredSubjects ?? this.filteredSubjects, availableGrades: availableGrades ?? this.availableGrades, selectedGrade: selectedGrade ?? this.selectedGrade, selectedStream: selectedStream ?? this.selectedStream, searchQuery: searchQuery ?? this.searchQuery, activeSubject: activeSubject ?? this.activeSubject, ); } } class CurriculumError extends CurriculumState { final String message; CurriculumError(this.message); } class CurriculumCubit extends Cubit { final CurriculumRepository _repo; CurriculumCubit({CurriculumRepository? repo}) : _repo = repo ?? CurriculumRepository(), super(CurriculumInitial()); Future fetchSubjects({String gradeLevel = 'grade_10', String stream = 'scientific'}) async { AppLogger.log('CurriculumCubit: Loading subjects for Grade: $gradeLevel ($stream)...', tag: 'CURRICULUM_CUBIT'); emit(CurriculumLoading()); try { final grades = await _repo.getAvailableGrades(); final subjects = await _repo.getSubjects(gradeLevel: gradeLevel, stream: stream); emit(CurriculumLoaded( subjects: subjects, filteredSubjects: subjects, availableGrades: grades, selectedGrade: gradeLevel, selectedStream: stream, )); } catch (e) { AppLogger.error('Failed to load curriculum subjects', error: e, tag: 'CURRICULUM_CUBIT'); emit(CurriculumError(e.toString())); } } void searchSubjects(String query) { final currentState = state; if (currentState is CurriculumLoaded) { final clean = query.trim().toLowerCase(); if (clean.isEmpty) { emit(currentState.copyWith(filteredSubjects: currentState.subjects, searchQuery: '')); return; } final filtered = currentState.subjects.where((s) { return s.title.toLowerCase().contains(clean) || s.englishTitle.toLowerCase().contains(clean) || s.id.toLowerCase().contains(clean); }).toList(); emit(currentState.copyWith(filteredSubjects: filtered, searchQuery: query)); } } void selectGrade(String gradeKey) { AppLogger.log('Switching active grade to $gradeKey...', tag: 'CURRICULUM_CUBIT'); fetchSubjects(gradeLevel: gradeKey); } void openSubject(SubjectModel subject) { final currentState = state; if (currentState is CurriculumLoaded) { emit(currentState.copyWith(activeSubject: subject)); } } }