import 'dart:collection'; import 'package:aitrainer_app/model/exercise.dart'; import 'package:intl/intl.dart'; import 'dart:async'; import 'package:aitrainer_app/bloc/development_diagram/development_diagram_bloc.dart'; import 'package:aitrainer_app/repository/exercise_repository.dart'; import 'package:aitrainer_app/repository/workout_tree_repository.dart'; import 'package:aitrainer_app/util/app_language.dart'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; part 'body_development_event.dart'; part 'body_development_state.dart'; enum DiagramDateFilterGroup { l3m, fm_lm, l3t, yearly } class BodyDevelopmentBloc extends Bloc { final WorkoutTreeRepository workoutTreeRepository; final ExerciseRepository exerciseRepository = ExerciseRepository(); List legendsL3t = ['2 trainigs ago', '1 training ago', 'last training']; List legendsFmlm = ['First month', '1 month ago', 'last month']; List legendsL3m = ['2 months ago', '1 month ago', 'last month']; List legends = []; List dateGroups = ["", "", ""]; List radarTicks = []; List radarFeatures = []; List> radarData = []; List> tempRadarData = []; DiagramGroup group = DiagramGroup.sumMass; DiagramDateFilterGroup filter = DiagramDateFilterGroup.l3t; @override BodyDevelopmentBloc({required this.workoutTreeRepository}) : super(BodyDevelopmentInitial()) { getData(); on(_onDateFilterChange); on(_onGroupChange); } List defaultGraphColors = [ Colors.green, Colors.blue, Colors.red, Colors.orange, ]; void resetTempData() { this.tempRadarData.clear(); this.tempRadarData = [ [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0] ]; } void getExerciseData() { workoutTreeRepository.sortedTree.clear(); workoutTreeRepository.sortByMuscleType(); this.resetTempData(); int index = 0; this.workoutTreeRepository.sortedTree.forEach((name, list) { print("name: $name"); int elementIndex = 0; list.forEach((element) { exerciseRepository.exerciseList = exerciseRepository.getExercisesByExerciseTypeId(element.exerciseTypeId); exerciseRepository.sortByDate(); int exerciseIndex = 0; exerciseRepository.exerciseList!.forEach((exercise) { final HashMap dateGroup = this.getDateGroup(exercise, elementIndex); if (dateGroup['dateGroupIndex'] != -1) { double unitQuantity = exercise.unitQuantity == null ? 1 : exercise.unitQuantity!; //print("index ${dateGroup['dateGroupIndex']} -- dateGroup: ${dateGroup['dateGroup']} -- value ${exercise.quantity! * unitQuantity}"); tempRadarData[dateGroup['dateGroupIndex']][index] += (exercise.quantity! * unitQuantity) / (elementIndex + exerciseIndex + 1); exerciseIndex++; } }); elementIndex++; }); index++; }); print(" temp $tempRadarData"); } HashMap getDateGroup(Exercise exercise, int elementIndex) { HashMap rc = HashMap(); rc['dateGroupIndex'] = -1; if (elementIndex == 0) { rc['dateGroupIndex'] = 0; rc['dateGroup'] = DateFormat(DateFormat.YEAR_MONTH, AppLanguage().appLocal.toString()).format(exercise.dateAdd!); dateGroups[0] = rc['dateGroup']; dateGroups[1] = DateFormat(DateFormat.YEAR_MONTH, AppLanguage().appLocal.toString()).format(DateTime.now().subtract(Duration(days: 32))); dateGroups[2] = DateFormat(DateFormat.YEAR_MONTH, AppLanguage().appLocal.toString()).format(DateTime.now()); print("DateGroups: ==== $dateGroups"); } else { final String dateGroup = DateFormat(DateFormat.YEAR_MONTH, AppLanguage().appLocal.toString()).format(exercise.dateAdd!); if (dateGroup == dateGroups[0]) { rc['dateGroup'] = dateGroup; rc['dateGroupIndex'] = 0; } else if (dateGroup == dateGroups[1]) { rc['dateGroup'] = dateGroup; rc['dateGroupIndex'] = 1; } else if (dateGroup == dateGroups[2]) { rc['dateGroup'] = dateGroup; rc['dateGroupIndex'] = 2; } } return rc; } Future getData() async { this.getExerciseData(); radarTicks = [20, 40, 60, 80, 100, 120, 140, 160]; radarData = [ [80, 95, 45, 67, 83, 40, 56, 78], [82, 90, 56, 77, 82, 40, 50, 87], [26, 112, 58, 70, 130, 49, 52, 127], ]; switch (this.filter) { case DiagramDateFilterGroup.l3t: legends = legendsL3t; break; case DiagramDateFilterGroup.l3m: legends = legendsL3m; break; case DiagramDateFilterGroup.fm_lm: legends = legendsFmlm; break; case DiagramDateFilterGroup.yearly: var date = DateTime.now(); legends = [ DateFormat(DateFormat.YEAR, AppLanguage().appLocal.toString()).format(date.subtract(Duration(days: 365 * 2))), DateFormat(DateFormat.YEAR, AppLanguage().appLocal.toString()).format(date.subtract(Duration(days: 365))), DateFormat(DateFormat.YEAR, AppLanguage().appLocal.toString()).format(date) ]; break; default: legends = legendsL3t; } } void _onDateFilterChange(BodyDevelopmentChangeDate event, Emitter emit) { emit(BodyDevelopmentLoading()); this.filter = event.filter; getData(); emit(BodyDevelopmentReady()); } void _onGroupChange(BodyDevelopmentChangeGroup event, Emitter emit) { emit(BodyDevelopmentLoading()); this.group = event.group; getData(); emit(BodyDevelopmentReady()); } }