import 'dart:async';

import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/model/workout_menu_tree.dart';
import 'package:aitrainer_app/repository/exercise_repository.dart';
import 'package:aitrainer_app/repository/workout_tree_repository.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<MenuEvent, MenuState> with Trans {
  final WorkoutTreeRepository menuTreeRepository;
  final ExerciseRepository exerciseRepository = ExerciseRepository();
  int parent;
  WorkoutMenuTree workoutItem;

  String infoTitle = "";
  String infoText = "";
  String infoText2 = "";
  String infoText3 = "";
  String infoLink = "";
  int missingParent = 0;
  String missingTreeName = "";

  BuildContext context;

  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;
    print("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!");
    }

    menuTreeRepository.sortByMuscleType();
    missingTreeName = exerciseRepository.nextMissingBaseExercise(menuTreeRepository.sortedTree);
    print("Missing " + missingTreeName);
    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<MenuState> mapEventToState(
    MenuEvent event,
  ) async* {
    try {
      if ( event is MenuCreate ) {
        yield MenuLoading();
        await menuTreeRepository.createTree();
        setMenuInfo();
        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;
        //print("menuitem " + workoutItem.id.toString() + " parent "+workoutItem.parent.toString());
        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) {
          //print("UP menuitem " + workoutItem.id.toString() + " parent " + workoutItem.parent.toString());
          menuTreeRepository.getBranch(workoutItem.parent);
        }
        yield MenuReady();
      } else if (event is MenuTreeJump) {
        yield MenuLoading();
        parent = event.parent;
        workoutItem = menuTreeRepository.getParentItem(parent);
        if ( workoutItem != null) {
          //print("JUMP menuitem " + workoutItem.id.toString() + " parent " + workoutItem.parent.toString());
          menuTreeRepository.getBranch(workoutItem.parent);
        }
        yield MenuReady();
      } else if (event is MenuClickExercise) {
        yield MenuLoading();
        // get exercise page
        yield MenuReady();
      }
    } on Exception catch(ex) {
      yield MenuError(message: ex.toString());
    }
  }
}