import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import '../../features/auth/models/auth_token.dart'; import '../../features/auth/models/auth_credentials.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( '/api/auth/login', data: credentials.toJson(), ); if (response.statusCode == 200) { return AuthToken.fromJson(response.data); } else { throw AuthException('Login failed'); } } on DioException catch (e) { if (kDebugMode) { print(e.toString()); } if (e.response?.statusCode == 401) { throw AuthException( e.response?.data['error'] ?? 'SOMETHING WENT WRONG'); } 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 checkTpin() async { try { final response = await _dio.get('/api/auth/tpin'); if (response.statusCode == 200) { return response.data['tpinSet'] as bool; } else { throw AuthException('Failed to check TPIN status'); } } on DioException catch (e) { if (kDebugMode) { print(e.toString()); } throw NetworkException('Network error during TPIN check'); } catch (e) { throw UnexpectedException( 'Unexpected error during TPIN check: ${e.toString()}'); } } Future setTpin(String tpin) async { try { final response = await _dio.post( '/api/auth/tpin', data: {'tpin': tpin}, ); if (response.statusCode != 200) { throw AuthException('Failed to set TPIN'); } } on DioException catch (e) { if (kDebugMode) { print(e.toString()); } throw NetworkException('Network error during TPIN setup'); } catch (e) { throw UnexpectedException( 'Unexpected error during TPIN setup: ${e.toString()}'); } } Future sendOtpForSettingPassword(String customerNo) async { try { final response = await _dio.get('/api/otp/send/set-password', queryParameters: { 'customerNo': customerNo, }); if (response.statusCode != 200) { throw Exception(response.data['error'] ?? 'Failed to send OTP'); } return; } on DioException catch (e) { throw Exception('Network error: ${e.message}'); } catch (e) { throw Exception('Unexpected error: ${e.toString()}'); } } Future verifyOtpForSettingPassword( String customerNo, String otp) async { try { final response = await _dio.get( '/api/otp/verify/set-password', queryParameters: {'customerNo': customerNo, 'otp': otp}, ); if (response.statusCode == 200) { return response.data['token']; } else { throw Exception(response.data['error'] ?? 'Failed to verify OTP'); } } on DioException catch (e) { throw Exception('Network error: ${e.message}'); } catch (e) { throw Exception('Unexpected error: ${e.toString()}'); } } Future changePassword(String newPassword, String token) async { final response = await _dio.post( '/api/auth/lpassword', data: {'login_password': newPassword}, options: Options(headers: {'Authorization': 'Bearer $token'}), ); if (response.statusCode != 200) { throw Exception('Error setting password'); } return; } }