import 'dart:developer'; import 'dart:io'; import 'package:calorimeter/food_entry/food_entry_bloc.dart'; import 'package:path_provider/path_provider.dart'; import 'package:universal_platform/universal_platform.dart'; class FoodStorage { static late FoodStorage _instance; late String path; final Map _foodLookupDatabase = {}; FoodStorage._create(); static Future create() async { var storage = FoodStorage._create(); Directory dir = Directory(''); if (UniversalPlatform.isDesktop) { dir = await getApplicationCacheDirectory(); } else if (UniversalPlatform.isAndroid) { dir = await getApplicationDocumentsDirectory(); } storage.path = dir.path; _instance = storage; return _instance; } static FoodStorage getInstance() => _instance; Future> getEntriesForDate(DateTime date) async { List entries = []; var filePath = '$path/${date.year}/${date.month}/${date.day}'; var file = File(filePath); var exists = await file.exists(); if (!exists) return []; var lines = await file.readAsLines(); for (var line in lines) { var fields = line.split(','); var entry = FoodEntry( name: fields[1], mass: double.parse(fields[2]), kcalPerMass: double.parse(fields[3])); entries.add(entry); } return entries; } Future writeEntriesForDate( DateTime date, List foodEntries) async { var filePath = '$path/${date.year}/${date.month}/${date.day}'; var file = File(filePath); var exists = await file.exists(); if (!exists) { await file.create(recursive: true); } String fullString = ''; for (var entry in foodEntries) { fullString += '${entry.toString()}\n'; } await file.writeAsString(fullString); } Future updateLimit(double limit) async { var filePath = '$path/limit'; var file = File(filePath); var exists = await file.exists(); if (!exists) { await file.create(); } await file.writeAsString(limit.toString()); } Future readLimit() async { var filePath = '$path/limit'; var file = File(filePath); var exists = await file.exists(); if (!exists) { return 2000; } var line = await file.readAsLines(); double limit; try { limit = double.parse(line[0]); } catch (e) { limit = 2000; } return limit; } Future readBrightness() async { var filePath = '$path/brightness'; var file = File(filePath); var exists = await file.exists(); if (!exists) { return 'dark'; } var line = await file.readAsLines(); if (line.isEmpty || (line[0] != 'dark' && line[0] != 'light')) { return 'dark'; } return line[0]; } Future writeBrightness(String brightness) async { var filePath = '$path/brightness'; var file = File(filePath); var exists = await file.exists(); if (!exists) { file.create(); } await file.writeAsString(brightness); } Future buildFoodLookupDatabase() async { // get a list of dates of the last 365 days var dates = List.generate(365, (idx) { var pastDay = Duration(days: idx); return DateTime.now().subtract(pastDay); }); for (var date in dates) { addFoodEntryToLookupDatabaseFor(date); } } Future addFoodEntryToLookupDatabaseFor(DateTime date) async { var entriesForDate = await getEntriesForDate(date); for (var entry in entriesForDate) { _foodLookupDatabase[entry.name] = entry.kcalPerMass; log("Added entry: ${entry.name}/${entry.kcalPerMass}"); } } void addFoodEntryToLookupDatabase(FoodEntry entry) { _foodLookupDatabase[entry.name] = entry.kcalPerMass; log("Added entry: ${entry.name}/${entry.kcalPerMass}"); } Map get getFoodEntryLookupDatabase => _foodLookupDatabase; }