import 'dart:async'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../domain/entities/setup_models.dart'; import '../../domain/repositories/setup_repository.dart'; import 'auth_provider.dart'; final setupRepositoryProvider = Provider((ref) { return SetupRepository(); }); final academicYearsListProvider = FutureProvider>(( ref, ) async { final repo = ref.read(setupRepositoryProvider); return repo.getAcademicYears(); }); final sectionsListProvider = FutureProvider>((ref) async { final repo = ref.read(setupRepositoryProvider); final user = ref.watch(authProvider).value; if (user?.role == 'teacher') { return repo.getTeacherSections(user!.id); } return repo.getAllSections(); }); final gradeLevelsListProvider = FutureProvider>(( ref, ) async { final repo = ref.read(setupRepositoryProvider); return repo.getGradeLevels(); }); final teacherSectionsProvider = FutureProvider.family, int>(( ref, teacherId, ) async { final repo = ref.read(setupRepositoryProvider); return repo.getTeacherSections(teacherId); }); // Setup mutation notifier for CRUD setup actions final setupMutationProvider = AsyncNotifierProvider( SetupMutationNotifier.new, ); class SetupMutationNotifier extends AsyncNotifier { @override FutureOr build() {} // Academic Years Future createAcademicYear({ required String yearRange, required String status, }) async { state = const AsyncLoading(); try { final repo = ref.read(setupRepositoryProvider); await repo.createAcademicYear(yearRange: yearRange, status: status); state = const AsyncData(null); ref.invalidate(academicYearsListProvider); } catch (e, st) { state = AsyncError(e, st); rethrow; } } Future updateAcademicYear({ required int id, required String yearRange, required String status, }) async { state = const AsyncLoading(); try { final repo = ref.read(setupRepositoryProvider); await repo.updateAcademicYear( id: id, yearRange: yearRange, status: status, ); state = const AsyncData(null); ref.invalidate(academicYearsListProvider); } catch (e, st) { state = AsyncError(e, st); rethrow; } } Future deleteAcademicYear(int id) async { state = const AsyncLoading(); try { final repo = ref.read(setupRepositoryProvider); await repo.deleteAcademicYear(id); state = const AsyncData(null); ref.invalidate(academicYearsListProvider); // Cascades delete sections ref.invalidate(sectionsListProvider); } catch (e, st) { state = AsyncError(e, st); rethrow; } } // Sections Future createSection({ required String name, required int gradeLevel, required int academicYearId, }) async { state = const AsyncLoading(); try { final repo = ref.read(setupRepositoryProvider); await repo.createSection( name: name, gradeLevel: gradeLevel, academicYearId: academicYearId, ); state = const AsyncData(null); ref.invalidate(sectionsListProvider); } catch (e, st) { state = AsyncError(e, st); rethrow; } } Future updateSection({ required int id, required String name, required int gradeLevel, required int academicYearId, }) async { state = const AsyncLoading(); try { final repo = ref.read(setupRepositoryProvider); await repo.updateSection( id: id, name: name, gradeLevel: gradeLevel, academicYearId: academicYearId, ); state = const AsyncData(null); ref.invalidate(sectionsListProvider); } catch (e, st) { state = AsyncError(e, st); rethrow; } } Future deleteSection(int id) async { state = const AsyncLoading(); try { final repo = ref.read(setupRepositoryProvider); await repo.deleteSection(id); state = const AsyncData(null); ref.invalidate(sectionsListProvider); } catch (e, st) { state = AsyncError(e, st); rethrow; } } // Grade Levels Future createGradeLevel({ required int level, required String name, }) async { state = const AsyncLoading(); try { final repo = ref.read(setupRepositoryProvider); await repo.createGradeLevel(level: level, name: name); state = const AsyncData(null); ref.invalidate(gradeLevelsListProvider); } catch (e, st) { state = AsyncError(e, st); rethrow; } } Future updateGradeLevel({ required int id, required int level, required String name, }) async { state = const AsyncLoading(); try { final repo = ref.read(setupRepositoryProvider); await repo.updateGradeLevel(id: id, level: level, name: name); state = const AsyncData(null); ref.invalidate(gradeLevelsListProvider); } catch (e, st) { state = AsyncError(e, st); rethrow; } } Future deleteGradeLevel(int id) async { state = const AsyncLoading(); try { final repo = ref.read(setupRepositoryProvider); await repo.deleteGradeLevel(id); state = const AsyncData(null); ref.invalidate(gradeLevelsListProvider); } catch (e, st) { state = AsyncError(e, st); rethrow; } } // Teacher Sections Assignment Future updateTeacherSections({ required int teacherId, required List sectionIds, }) async { state = const AsyncLoading(); try { final repo = ref.read(setupRepositoryProvider); await repo.updateTeacherSections( teacherId: teacherId, sectionIds: sectionIds, ); state = const AsyncData(null); ref.invalidate(teacherSectionsProvider(teacherId)); } catch (e, st) { state = AsyncError(e, st); rethrow; } } }