import 'package:flutter_bloc/flutter_bloc.dart'; import '../../core/services/storage_service.dart'; import '../../core/utils/app_logger.dart'; import '../../data/models/teacher_models.dart'; import '../../data/repositories/teacher_repository.dart'; abstract class TeacherAuthState {} class TeacherAuthInitial extends TeacherAuthState {} class TeacherAuthLoading extends TeacherAuthState {} class TeacherAuthOtpSent extends TeacherAuthState { final String phoneNumber; TeacherAuthOtpSent({required this.phoneNumber}); } class TeacherAuthenticated extends TeacherAuthState { final TeacherProfileModel profile; TeacherAuthenticated({required this.profile}); } class TeacherUnauthenticated extends TeacherAuthState {} class TeacherAuthError extends TeacherAuthState { final String message; TeacherAuthError(this.message); } class TeacherAuthCubit extends Cubit { final TeacherRepository repository; final StorageService _storage; TeacherAuthCubit({ required this.repository, StorageService? storage, }) : _storage = storage ?? StorageService(), super(TeacherAuthInitial()); Future checkSession() async { AppLogger.log('Checking Teacher Session...', tag: 'TEACHER_AUTH'); emit(TeacherAuthLoading()); try { final token = await _storage.getToken(); if (token == null || token.isEmpty) { AppLogger.log('No teacher token -> Unauthenticated', tag: 'TEACHER_AUTH'); emit(TeacherUnauthenticated()); return; } final profile = await repository.getProfileStatus(); AppLogger.log('Teacher authenticated: ${profile.name} (${profile.specialization})', tag: 'TEACHER_AUTH'); emit(TeacherAuthenticated(profile: profile)); } catch (e) { AppLogger.error('Session check failed', error: e, tag: 'TEACHER_AUTH'); emit(TeacherUnauthenticated()); } } void resetToPhone() { emit(TeacherUnauthenticated()); } Future sendOtp(String phoneNumber) async { emit(TeacherAuthLoading()); try { final res = await repository.requestOtp(phoneNumber); if (res['status'] == 'success') { emit(TeacherAuthOtpSent(phoneNumber: phoneNumber)); } else { emit(TeacherAuthError(res['message']?.toString() ?? 'فشل إرسال رمز التحقق')); } } catch (e) { emit(TeacherAuthError(e.toString())); } } Future verifyOtp( String phoneNumber, String otp, { String? fullName, String? specialization, String? schoolName, List? gradesTaught, }) async { emit(TeacherAuthLoading()); try { final res = await repository.verifyOtp(phoneNumber, otp, fullName: fullName); if (res['status'] == 'success') { if ((fullName ?? '').trim().isNotEmpty && (specialization ?? '').trim().isNotEmpty && (schoolName ?? '').trim().isNotEmpty && (gradesTaught?.isNotEmpty ?? false)) { try { await repository.setupProfile( fullName: fullName!.trim(), specialization: specialization!.trim(), schoolName: schoolName!.trim(), gradesTaught: gradesTaught!, bio: '', ); } catch (_) {} } final profile = await repository.getProfileStatus(); emit(TeacherAuthenticated(profile: profile)); } else { emit(TeacherAuthError(res['message']?.toString() ?? 'رمز التحقق غير صحيح')); } } catch (e) { emit(TeacherAuthError(e.toString())); } } Future updateProfile({ required String fullName, required String specialization, required String schoolName, required List gradesTaught, required String bio, }) async { emit(TeacherAuthLoading()); try { final updated = await repository.setupProfile( fullName: fullName, specialization: specialization, schoolName: schoolName, gradesTaught: gradesTaught, bio: bio, ); emit(TeacherAuthenticated(profile: updated)); } catch (e) { emit(TeacherAuthError(e.toString())); } } Future logout() async { emit(TeacherAuthLoading()); await _storage.clearSession(); emit(TeacherUnauthenticated()); } }