import 'dart:developer'; import 'package:dio/dio.dart'; import '../../features/auth/models/auth_token.dart'; import '../../features/auth/models/auth_credentials.dart'; import '../../data/models/user.dart'; import '../../core/errors/exceptions.dart'; class AuthService { final Dio _dio; AuthService(this._dio); Future login(AuthCredentials credentials) async { try { final response = await _dio.post( '/auth/login', data: credentials.toJson(), ); if (response.statusCode == 200) { return AuthToken.fromJson(response.data); } else { throw AuthException('Login failed'); } } on DioException catch (e) { if (e.response?.statusCode == 401) { throw AuthException('Invalid credentials'); } throw NetworkException('Network error during login'); } catch (e) { throw UnexpectedException('Unexpected error during login: ${e.toString()}'); } } Future refreshToken(String refreshToken) async { try { final response = await _dio.post( '/auth/refresh', data: {'refresh_token': refreshToken}, ); if (response.statusCode == 200) { return AuthToken.fromJson(response.data); } else { throw AuthException('Token refresh failed'); } } catch (e) { throw AuthException('Failed to refresh token: ${e.toString()}'); } } Future logout(String refreshToken) async { try { await _dio.post( '/auth/logout', data: {'refresh_token': refreshToken}, ); } catch (e) { // We might want to just log this error rather than throwing, // as logout should succeed even if the server call fails log('Logout error: ${e.toString()}'); } } Future getUserProfile() async { try { final response = await _dio.get('/auth/profile'); if (response.statusCode == 200) { return User.fromJson(response.data); } else { throw AuthException('Failed to get user profile'); } } catch (e) { throw AuthException('Error fetching user profile: ${e.toString()}'); } } }