import 'package:dio/dio.dart'; import 'package:eatvio_app/features/barcode/models/barcode_product_model.dart'; import 'package:eatvio_app/features/barcode/services/barcode_service.dart'; class BarcodeRepository { final BarcodeService barcodeService; final Dio dio; BarcodeRepository({ required this.barcodeService, required this.dio, }); /// Получить информацию о продукте по штрихкоду /// Возвращает либо данные продукта, либо статус задачи обработки Future getProductByBarcode(String barcode) async { final response = await dio.get>( '/api/gsone/barcode/$barcode', options: Options(validateStatus: (_) => true), ); final code = response.statusCode ?? 0; final data = response.data; if (data is! Map) { throw DioException( requestOptions: response.requestOptions, response: response, message: 'Invalid barcode response', ); } if (code == 200) { final product = BarcodeProductModel.fromJson(data); return BarcodeResult.success(product); } if (code == 202) { final taskStatus = BarcodeTaskStatusModel.fromJson(data); return BarcodeResult.processing(taskStatus.taskId ?? ''); } throw DioException( requestOptions: response.requestOptions, response: response, message: 'Unexpected status code: $code', ); } /// Получить статус задачи обработки Future getTaskStatus(String taskId) async { final statusModel = await barcodeService.getTaskStatus(taskId: taskId); if (statusModel.status == 'completed' && statusModel.data != null) { return BarcodeTaskStatus.completed(statusModel.data!); } else if (statusModel.status == 'failed') { return BarcodeTaskStatus.failed(); } else { return BarcodeTaskStatus.processing(); } } } /// Результат запроса информации о продукте по штрихкоду class BarcodeResult { final BarcodeResultType type; final BarcodeProductModel? product; final String? taskId; BarcodeResult._({required this.type, this.product, this.taskId}); factory BarcodeResult.success(BarcodeProductModel product) { return BarcodeResult._(type: BarcodeResultType.success, product: product); } factory BarcodeResult.processing(String taskId) { return BarcodeResult._(type: BarcodeResultType.processing, taskId: taskId); } } enum BarcodeResultType { success, processing, } /// Статус задачи обработки class BarcodeTaskStatus { final BarcodeTaskStatusType type; final BarcodeProductModel? product; BarcodeTaskStatus._({required this.type, this.product}); factory BarcodeTaskStatus.completed(BarcodeProductModel product) { return BarcodeTaskStatus._(type: BarcodeTaskStatusType.completed, product: product); } factory BarcodeTaskStatus.processing() { return BarcodeTaskStatus._(type: BarcodeTaskStatusType.processing); } factory BarcodeTaskStatus.failed() { return BarcodeTaskStatus._(type: BarcodeTaskStatusType.failed); } } enum BarcodeTaskStatusType { completed, processing, failed, }