import 'package:ambito/src/entity/_general/filter/item_filter_repository.dart'; import 'package:ambito/src/entity/entities.dart'; import 'package:ambito/src/entity/measure/measure_category.dart'; import 'package:ambito/src/entity/measure/measure_type.dart'; import 'package:ambito/src/extensions/extensions.dart'; import 'package:ambito/src/packages/ambito_db/base_db.dart'; import 'package:isar/isar.dart'; import '../../consts/consts.dart'; class MeasureRepository extends BaseDB { @override IsarCollection collection = isar.measures; Future getCategoriesAndTypes() async { final categoriesMap = {}; final typesMap = {}; final autoIncrementCat = isar.measureCategorys.autoIncrement; final autoIncrementType = isar.measureTypes.autoIncrement; // Fetch all measures final allMeasures = await isar.measures.where().findAll(); for (final measure in allMeasures) { if (measure.actionGroup == null || measure.factsheetAreaType == null || measure.factsheetAreaType!.isEmpty) { continue; } // Process categories for (final cat in measure.factsheetAreaType!) { final categoryName = cat.value; if (categoryName == null) continue; if (!categoriesMap.containsKey(categoryName)) { categoriesMap[categoryName] = MeasureCategory() ..id = autoIncrementCat() ..name = categoryName ..image = 'images/actions/areatype/${categoryName.toLowerCase().replaceUmlauts()}.jpg' ..description = 'Lorem ipsum dolor sit amet.' ..children = 1; } else { categoriesMap[categoryName]!.children++; } } // Process types final actionGroupName = measure.actionGroup!.value; if (actionGroupName == null) continue; if (!typesMap.containsKey(actionGroupName)) { typesMap[actionGroupName] = MeasureType() ..id = autoIncrementType() ..name = actionGroupName ..description = measure.factsheetDefinition ..image = (measure.files != null && measure.files!.isNotEmpty) ? measure.files![0].url : 'images/spacer.png' // Add the appropriate image URL if available ..children = 1; } else { typesMap[actionGroupName]!.children++; } } // Convert maps to lists isar.write((isar) { isar.measureCategorys.putAll(categoriesMap.values.toList()); isar.measureTypes.putAll(typesMap.values.toList()); }); return true; } Future buildLists() async { var measures = getAll(); Map>> lists = {}; List props = MeasureSchema.schema.properties; for (var prop in props) { if (prop.type == IsarType.objectList) { lists[prop.name] = []; } } logger.d(lists); int counter = 0; for (Measure measure in measures) { var json = measure.toJson(); if (counter == 0) { logger.d(json); } lists.forEach((key, value) { if (counter == 0) { logger.d(key); } if (json[key] != null) { logger.d(json[key]); } }); counter++; } return true; } Future buildMeasureFilters() async { Map> filtersAreaType = {}; Map> filtersMeasureGroup = {}; Map> filterMonths = {}; Map> filterFundingPrograms = {}; Map colors = {}; var measures = getAll(); for (Measure measure in measures) { measure.factsheetAreaType?.forEach((ivc) { filtersAreaType.putIfAbsent(ivc.value!, () => []).add(measure.id); colors[ivc.value!] = ivc.color!; }); if (measure.actionGroup != null) { filtersMeasureGroup .putIfAbsent(measure.actionGroup!.value!, () => []) .add(measure.id); colors[measure.actionGroup!.value!] = measure.actionGroup!.color!; } measure.timeFrame?.forEach((ivc) { filterMonths.putIfAbsent(ivc.value!, () => []).add(measure.id); colors[ivc.value!] = ivc.color!; }); measure.fundingPrograms?.forEach((ivc) { filterFundingPrograms.putIfAbsent(ivc.value!, () => []).add(measure.id); }); } final itemFilterRepo = ItemFilterRepository(); final autoIncrement = isar.itemFilters.autoIncrement; itemFilterRepo.putAll(filtersAreaType.entries .map((entry) => ItemFilter() ..id = autoIncrement() ..name = entry.key ..type = 'areaType' ..description = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy.' ..image = 'images/actions/areatype/${entry.key.toLowerCase().replaceUmlauts()}.jpg' ..color = colors[entry.key] ..ids = entry.value) .toList()); itemFilterRepo.putAll(filtersMeasureGroup.entries .map((entry) => ItemFilter() ..id = autoIncrement() ..name = entry.key ..type = 'group' ..description = 'Lorem ipsum dolor sit amet, consetetur sadipscing.' ..image = 'images/actions/areatype/${entry.key.toLowerCase().replaceUmlauts()}.jpg' ..color = colors[entry.key] ..ids = entry.value) .toList()); itemFilterRepo.putAll(filterMonths.entries .map((entry) => ItemFilter() ..id = autoIncrement() ..name = entry.key ..type = 'month' ..ids = entry.value) .toList()); itemFilterRepo.putAll(filterFundingPrograms.entries .map((entry) => ItemFilter() ..id = autoIncrement() ..name = entry.key ..type = 'fundingProgram' ..ids = entry.value) .toList()); return true; } int getMeasureCount() { return isar.measures.where().count(); } List getByIds(List ids) { return isar.measures.getAll(ids); } List getAllOrdered() { return isar.measures.where().sortByName().findAll(); } Future downloadImages() async { List measures = isar.measures.where().findAll(); List files = []; for (Measure measure in measures) { if (measure.files != null) { for (FilePart file in measure.files!) { files.add(file.url!); } } } return true; } List getCategories() { return isar.measureCategorys.where().findAll(); } List getTypes() { return isar.measureTypes.where().findAll(); } }