import 'package:logging/logging.dart'; import 'package:share_plus/share_plus.dart'; import 'package:pshared/api/requests/signup.dart'; import 'package:pshared/api/responses/account.dart'; import 'package:pshared/api/requests/login_data.dart'; import 'package:pshared/api/requests/password/change.dart'; import 'package:pshared/api/requests/password/forgot.dart'; import 'package:pshared/api/requests/password/reset.dart'; import 'package:pshared/data/mapper/account/account.dart'; import 'package:pshared/models/account/account.dart'; import 'package:pshared/models/describable.dart'; import 'package:pshared/models/auth/login_outcome.dart'; import 'package:pshared/service/authorization/service.dart'; import 'package:pshared/service/files.dart'; import 'package:pshared/service/services.dart'; import 'package:pshared/utils/http/requests.dart'; class AccountService { static final _logger = Logger('service.account'); static const String _objectType = Services.account; static Future login(LoginData login) async { _logger.fine('Logging in'); return AuthorizationService.login(_objectType, login); } static Future restore() async { return AuthorizationService.restore(); } static Future signup(SignupRequest request) async { // Use regular HTTP for public signup endpoint (no auth needed) await getPOSTResponse(_objectType, 'signup', request.toJson()); } static Future logout() async { _logger.fine('Logging out'); return AuthorizationService.logout(); } static Future _getAccount(Future> future) async { final response = await future; return AccountResponse.fromJson(response).account.toDomain(); } static Future update(Account account) async { _logger.fine('Patching account ${account.id}'); // Use AuthorizationService for authenticated operations return _getAccount(AuthorizationService.getPUTResponse(_objectType, '', account.toDTO().toJson())); } static Future forgotPassword(String email) async { _logger.fine('Requesting password reset for email: $email'); await getPUTResponse(_objectType, 'password', ForgotPasswordRequest.build(login: email).toJson()); } static Future resetPassword(String accountRef, String token, String newPassword) async { _logger.fine('Resetting password for account: $accountRef'); await getPOSTResponse(_objectType, 'password/reset/$accountRef/$token', ResetPasswordRequest.build(password: newPassword).toJson()); } static Future resetUsername(Account account, String userName) async { _logger.fine('Updating username for account: ${account.id}'); final updatedAccount = account.copyWith( describable: account.describable.copyWith(name: userName), ); return update(updatedAccount); } static Future changePassword(String oldPassword, String newPassword) async { _logger.fine('Changing password'); return _getAccount(AuthorizationService.getPATCHResponse( _objectType, 'password', ChangePassword(oldPassword: oldPassword, newPassword: newPassword).toJson(), )); } static Future uploadAvatar(String id, XFile avatarFile) async { _logger.fine('Uploading avatar'); return FilesService.uploadImage(_objectType, id, avatarFile); } }