import 'dart:convert'; import 'package:shared_preferences/shared_preferences.dart'; import '../models/address_entry.dart'; import '../models/address_record.dart'; import '../models/auth_session.dart'; abstract class AddressRepository { Future saveAddress({ required AuthSession session, required AddressEntry address, }); Future> getMyAddresses({required AuthSession session}); } class LocalAddressRepository implements AddressRepository { const LocalAddressRepository(); static const String _localAddressPrefix = 'local_addresses_'; @override Future saveAddress({ required AuthSession session, required AddressEntry address, }) async { await _persistLocalAddress(session: session, address: address); } @override Future> getMyAddresses({required AuthSession session}) async { return _loadLocalAddresses(session); } Future _persistLocalAddress({required AuthSession session, required AddressEntry address}) async { final prefs = await SharedPreferences.getInstance(); final key = '$_localAddressPrefix${session.email.toLowerCase()}'; final existing = await _loadLocalAddresses(session); final records = [ AddressRecord( id: DateTime.now().millisecondsSinceEpoch, houseNumber: address.houseNumber, colonia: address.colonia, street: address.street, ), ...existing, ]; final encoded = jsonEncode( records .map( (record) => { 'id': record.id, 'houseNumber': record.houseNumber, 'colonia': record.colonia, 'street': record.street, }, ) .toList(growable: false), ); await prefs.setString(key, encoded); } Future> _loadLocalAddresses(AuthSession session) async { final prefs = await SharedPreferences.getInstance(); final key = '$_localAddressPrefix${session.email.toLowerCase()}'; final raw = prefs.getString(key); if (raw == null || raw.trim().isEmpty) { return []; } final decoded = jsonDecode(raw); if (decoded is! List) { return []; } return decoded .whereType>() .map(AddressRecord.fromJson) .toList(growable: false); } } class AddressException implements Exception { AddressException(this.message); final String message; @override String toString() => message; }