import 'package:dartz/dartz.dart'; import '../../../../core/errors/failures.dart'; import '../entities/scan_entity.dart'; import '../repositories/scanner_repository.dart'; /// Use case for saving scan data /// Handles the business logic for saving scan information to both remote and local storage class SaveScanUseCase { final ScannerRepository repository; SaveScanUseCase(this.repository); /// Execute the save scan operation /// /// First saves to remote server, then saves locally only if remote save succeeds /// This ensures data consistency and allows for offline-first behavior Future> call(SaveScanParams params) async { // Validate input parameters final validationResult = _validateParams(params); if (validationResult != null) { return Left(ValidationFailure(validationResult)); } try { // Save to remote server first final remoteResult = await repository.saveScan( barcode: params.barcode, field1: params.field1, field2: params.field2, field3: params.field3, field4: params.field4, ); return remoteResult.fold( (failure) => Left(failure), (_) async { // If remote save succeeds, save to local storage final scanEntity = ScanEntity( barcode: params.barcode, timestamp: DateTime.now(), field1: params.field1, field2: params.field2, field3: params.field3, field4: params.field4, ); final localResult = await repository.saveScanLocally(scanEntity); return localResult.fold( (failure) { // Log the local save failure but don't fail the entire operation // since remote save succeeded return const Right(null); }, (_) => const Right(null), ); }, ); } catch (e) { return Left(UnknownFailure('Failed to save scan: ${e.toString()}')); } } /// Validate the input parameters String? _validateParams(SaveScanParams params) { if (params.barcode.trim().isEmpty) { return 'Barcode cannot be empty'; } if (params.field1.trim().isEmpty) { return 'Field 1 cannot be empty'; } if (params.field2.trim().isEmpty) { return 'Field 2 cannot be empty'; } if (params.field3.trim().isEmpty) { return 'Field 3 cannot be empty'; } if (params.field4.trim().isEmpty) { return 'Field 4 cannot be empty'; } return null; } } /// Parameters for the SaveScanUseCase class SaveScanParams { final String barcode; final String field1; final String field2; final String field3; final String field4; SaveScanParams({ required this.barcode, required this.field1, required this.field2, required this.field3, required this.field4, }); @override String toString() { return 'SaveScanParams{barcode: $barcode, field1: $field1, field2: $field2, field3: $field3, field4: $field4}'; } }