import 'dart:convert'; import 'package:enter_farma_plus_mobile/src/core/storage/tenant_session_store.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; final offlinePosStoreProvider = Provider( (ref) => OfflinePosStore(ref.watch(secureStorageProvider)), ); class OfflinePosStore { const OfflinePosStore(this._storage); static const _itemsKey = 'offline.pos.items_sale'; static const _customersKey = 'offline.pos.customers'; static const _tablesKey = 'offline.pos.document_tables'; static const _pendingSalesKey = 'offline.pos.pending_sales'; final FlutterSecureStorage _storage; Future saveItems(List> rows) async { await _storage.write(key: _itemsKey, value: jsonEncode(rows)); } Future saveCustomers(List> rows) async { await _storage.write(key: _customersKey, value: jsonEncode(rows)); } Future saveTables(Map tables) async { await _storage.write(key: _tablesKey, value: jsonEncode(tables)); } Future>> readItems() async { return _readList(_itemsKey); } Future>> readCustomers() async { return _readList(_customersKey); } Future> readTables() async { final raw = await _storage.read(key: _tablesKey); if (raw == null || raw.isEmpty) return const {}; final decoded = jsonDecode(raw); if (decoded is Map) return decoded; return const {}; } Future>> readPendingSales() async { return _readList(_pendingSalesKey); } Future enqueuePendingSale(Map row) async { final pending = await readPendingSales(); pending.add(row); await _storage.write(key: _pendingSalesKey, value: jsonEncode(pending)); } Future replacePendingSales(List> rows) async { await _storage.write(key: _pendingSalesKey, value: jsonEncode(rows)); } Future updatePendingSale( String idempotencyKey, Map replacement, ) async { final rows = await readPendingSales(); final updated = rows.map((row) { if ('${row['idempotency_key']}' == idempotencyKey) { return replacement; } return row; }).toList(); await replacePendingSales(updated); } Future removePendingSale(String idempotencyKey) async { final rows = await readPendingSales(); final filtered = rows .where((row) => '${row['idempotency_key']}' != idempotencyKey) .toList(); await replacePendingSales(filtered); } Future>> _readList(String key) async { final raw = await _storage.read(key: key); if (raw == null || raw.isEmpty) return >[]; final decoded = jsonDecode(raw); if (decoded is! List) return >[]; return decoded .whereType() .map((e) => Map.from(e)) .toList(); } }