import 'dart:io'; import 'package:dio/dio.dart'; import 'package:eatvio_app/features/create_diet/repositories/create_diet_repository.dart'; import 'package:eatvio_app/features/create_diet/services/create_diet_service.dart'; import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart'; import 'package:eatvio_app/features/glossary/models/glossary_model.dart'; import 'package:eatvio_app/features/glossary/repositories/glossary_repository.dart'; import 'package:eatvio_app/features/glossary/services/glossary_service.dart'; import 'package:eatvio_app/features/profile/models/profile_model.dart'; import 'package:eatvio_app/features/profile/repositories/profile_repository.dart'; import 'package:eatvio_app/features/profile/services/profile_service.dart'; import 'package:retrofit/dio.dart' show HttpResponse; import '../../fixtures/fixture_reader.dart'; class FixtureCreateDietRepository extends CreateDietRepository { FixtureCreateDietRepository() : super(createDietService: _NoopCreateDietService()); final List> createRequests = >[]; final List> updateRequests = >[]; Map>> get nutritionFixture { final nutritionData = FixtureReader.readAsMap('create_diet/nutrition_response.json'); final result = >>{}; for (final dayEntry in nutritionData.entries) { final dayIndex = int.parse(dayEntry.key); final dayData = dayEntry.value as Map; final dayMap = >{}; for (final mealEntry in dayData.entries) { final mealIndex = int.parse(mealEntry.key); final mealData = mealEntry.value as Map; final mealMap = {}; for (final portionEntry in mealData.entries) { final portionIndex = int.parse(portionEntry.key); final portionData = portionEntry.value as Map; // Convert portion string to Portion enum final portionStr = portionData['portion'] as String; Portion portion; switch (portionStr) { case 'gr': case 'grams': portion = Portion.grams; break; case 'milliliters': portion = Portion.milliliters; break; case 'pcs': portion = Portion.pcs; break; default: portion = Portion.grams; } mealMap[portionIndex] = DailySchedule( name: portionData['name'] as String, portion: portion, quantity: portionData['quantity'] as int, productNutritionalValueId: portionData['product_nutritional_value_id'] as String?, ); } dayMap[mealIndex] = mealMap; } result[dayIndex] = dayMap; } return result; } @override Future createDiet({ required String name, required int duration, required DietState state, required String meatType, required String carbType, required String vegType, required String lightType, required String details, required File image, required List>> dailySchedule, }) async { createRequests.add({ 'name': name, 'duration': duration, 'details': details, 'state': state.toString(), 'types': {'meat': meatType == '1', 'carb': carbType == '1', 'veg': vegType == '1', 'light': lightType == '1'}, }); final createdDietFixture = FixtureReader.readAsMap('create_diet/created_diet_response.json'); return CreatedDiet.fromJson(createdDietFixture); } @override Future>>> getDietPortionsNutrition(int dietId) async { return nutritionFixture; } @override Future updateDiet({ required int dietId, required DietState state, String? name, int? duration, String? meatType, String? carbType, String? vegType, String? lightType, String? details, File? image, List>>? dailySchedule, }) async { updateRequests.add({ 'id': dietId, 'name': name, 'duration': duration, 'details': details, 'state': state.toString(), if (meatType != null || carbType != null || vegType != null || lightType != null) 'types': { if (meatType != null) 'meat': meatType == '1', if (carbType != null) 'carb': carbType == '1', if (vegType != null) 'veg': vegType == '1', if (lightType != null) 'light': lightType == '1', }, }); } } class FixtureProfileRepository extends ProfileRepository { FixtureProfileRepository() : super(profileService: _NoopProfileService()); @override Future getMyProfile() async { final profileFixture = FixtureReader.readAsMap('profile/my_profile_response.json'); return ProfileModel.fromJson(profileFixture); } } class FixtureGlossaryRepository extends GlossaryRepository { FixtureGlossaryRepository() : super(glossaryService: _NoopGlossaryService()); @override Future> getGlossaryListByQuery(String query) async { final results = FixtureReader.readAsMap('create_diet/glossary_search_response.json')['results'] as List; return results.map((item) => GlossaryModel.fromJson(item as Map)).toList(); } } class _NoopCreateDietService implements CreateDietService { @override Future createDraftedDiet({required FormData formData}) { throw UnimplementedError(); } @override Future createPersonalDiet({required FormData formData}) { throw UnimplementedError(); } @override Future createPublishedDiet({required FormData formData}) { throw UnimplementedError(); } @override Future getDietPortionsNutrition({required int diet}) { throw UnimplementedError(); } @override Future updateDrafted({required int diet, required FormData formData}) { throw UnimplementedError(); } @override Future updatePersonal({required int diet, required FormData formData}) { throw UnimplementedError(); } @override Future updatePublished({required int diet, required FormData formData}) { throw UnimplementedError(); } } class _NoopProfileService implements ProfileService { @override noSuchMethod(Invocation invocation) => throw UnimplementedError('ProfileService call ${invocation.memberName}'); } class _NoopGlossaryService implements GlossaryService { @override noSuchMethod(Invocation invocation) => throw UnimplementedError('GlossaryService call ${invocation.memberName}'); }