import 'dart:async'; import 'dart:collection'; import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/exercise_ability.dart'; import 'package:aitrainer_app/model/workout_menu_tree.dart'; import 'package:aitrainer_app/repository/exercise_device_repository.dart'; import 'package:aitrainer_app/repository/exercise_repository.dart'; import 'package:aitrainer_app/repository/workout_tree_repository.dart'; import 'package:aitrainer_app/service/logging.dart'; import 'package:aitrainer_app/util/trans.dart'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/cupertino.dart'; import 'package:meta/meta.dart'; part 'menu_event.dart'; part 'menu_state.dart'; class MenuBloc extends Bloc with Trans, Logging { final WorkoutTreeRepository menuTreeRepository; final ExerciseRepository exerciseRepository = ExerciseRepository(); ExerciseDeviceRepository exerciseDeviceRepository = ExerciseDeviceRepository(); int parent; WorkoutMenuTree workoutItem; List listFilterDevice = List(); String infoTitle = ""; String infoText = ""; String infoText2 = ""; String infoText3 = ""; String infoLink = ""; int missingParent = 0; String missingTreeName = ""; BuildContext context; ExerciseAbility ability; MenuBloc({this.menuTreeRepository}) : super(MenuInitial()) { parent = 0; } void setMenuInfo() { double percent = Cache().getPercentExercises(); if (percent == -1) { exerciseRepository.getBaseExerciseFinishedPercent(); percent = Cache().getPercentExercises(); } if (context == null) return; percent = percent * 100; //log("Percent " + percent.toString()); if (percent == -1 || percent == 0) { infoTitle = t("Greetings!"); infoText = t("The purpose is to measure you physical condition") + " " + t("The suggested order of the exercises: chest - biceps - triceps - back - shoulders - core - tigh - calf."); infoText2 = t("I suggest begin your tests with a"); infoText3 = t("Go to the menu Strength - One Rep Max - Chest, and select your favourite exercise."); infoLink = t("Bring me there"); } else if (percent > 0 && percent < 20) { infoTitle = t("Nice! This is a good start"); } else if (percent > 20 && percent < 40) { infoTitle = t("Go on!") + " " + t("You are on track"); } else if (percent > 60 && percent < 80) { infoTitle = t("Persistence!") + " " + t("Not so much left"); } else if (percent > 80 && percent < 100) { infoTitle = t("Almost!") + " " + t("You have only 1-2 exercise left to finish!"); } else { infoTitle = t("Congratulation!"); infoText2 = t("You have achieved to first 100% test-round!"); infoText3 = t("Now you unlocked: Development By Muscles and the Suggested Trainings Plan"); } menuTreeRepository.sortByMuscleType(); missingTreeName = exerciseRepository.nextMissingBaseExercise(menuTreeRepository.sortedTree); //log("Missing " + missingTreeName); if (missingTreeName != null) { if (percent > 0) { infoText = t("Please continue your tests with a") + " '" + missingTreeName + "' " + t("exercise!"); infoLink = t("Bring me there"); } } } void setContext(BuildContext context) { this.context = context; } @override Stream mapEventToState( MenuEvent event, ) async* { try { if (event is MenuCreate) { yield MenuLoading(); //await menuTreeRepository.createTree(); setMenuInfo(); exerciseDeviceRepository.setDevices(Cache().getDevices()); /* exerciseDeviceRepository.getGymDevices().forEach((element) { listFilterDevice.add(element.exerciseDeviceId); }); */ yield MenuReady(); } else if (event is MenuRecreateTree) { // ie. at language changes await menuTreeRepository.createTree(); yield MenuReady(); } else if (event is MenuTreeDown) { // get child menus or exercises yield MenuLoading(); parent = event.parent; workoutItem = event.item; if (workoutItem != null) { setAbility(workoutItem.nameEnglish); } menuTreeRepository.getBranch(event.parent); yield MenuReady(); } else if (event is MenuTreeUp) { yield MenuLoading(); // get parent menus or exercises parent = event.parent; workoutItem = menuTreeRepository.getParentItem(parent); if (workoutItem != null) { menuTreeRepository.getBranch(workoutItem.parent); setAbility(workoutItem.nameEnglish); } yield MenuReady(); } else if (event is MenuTreeJump) { yield MenuLoading(); parent = event.parent; workoutItem = menuTreeRepository.getParentItem(parent); if (workoutItem != null) { menuTreeRepository.getBranch(workoutItem.parent); setAbility(workoutItem.nameEnglish); } yield MenuReady(); } else if (event is MenuClickExercise) { yield MenuLoading(); // get exercise page yield MenuReady(); } else if (event is MenuFilterExerciseType) { yield MenuLoading(); final int deviceId = event.deviceId; if (selectedDevice(deviceId)) { listFilterDevice.add(deviceId); } else { listFilterDevice.remove(deviceId); } yield MenuReady(); } } on Exception catch (ex) { yield MenuError(message: ex.toString()); } } void setAbility(String name) { switch (name) { case "One Rep Max": ability = ExerciseAbility.oneRepMax; break; case "Endurance": ability = ExerciseAbility.endurance; break; case "Cardio": case "Body Compositions": ability = ExerciseAbility.none; break; } log("Ability: " + ability.toString() + " name:" + name); } bool selectedDevice(int deviceId) { return !listFilterDevice.contains(deviceId); } LinkedHashMap getFilteredBranch(int parent) { if (parent == null) return LinkedHashMap(); LinkedHashMap branch = menuTreeRepository.getBranch(parent); if (!menuTreeRepository.isChild(parent) || ability.toString() == ExerciseAbility.none.toString() || listFilterDevice.isEmpty) { return branch; } LinkedHashMap filtered = LinkedHashMap(); branch.forEach((key, value) { final WorkoutMenuTree elem = value; if (elem.exerciseType != null) { for (int i = 0; i < elem.exerciseType.devices.length; i++) { if (listFilterDevice.contains(elem.exerciseType.devices[i])) { filtered[elem.name] = elem; } } } }); return filtered; } }