import 'package:aitrainer_app/repository/exercise_repository.dart';
import 'package:flutter_form_bloc/flutter_form_bloc.dart';

class ExerciseControlFormBloc extends FormBloc<String, String> {
  final ExerciseRepository exerciseRepository;
  int step = 1;
  final double percentToCalculate;
  final bool readonly;
  String times;

  final initialRMField = TextFieldBloc(
  );

  final quantity1Field = TextFieldBloc(
  );

  final unitQuantity1Field = TextFieldBloc(
  );

  final quantity2Field = TextFieldBloc(
  );

  final unitQuantity2Field = TextFieldBloc(
  );

  final quantity3Field = TextFieldBloc(
  );

  final unitQuantity3Field = TextFieldBloc(
  );



  ExerciseControlFormBloc({this.exerciseRepository, this.percentToCalculate, this.readonly}) {
    addFieldBlocs(fieldBlocs: [
      initialRMField,
      quantity1Field,
      unitQuantity1Field,
      quantity2Field,
      unitQuantity2Field,
      quantity3Field,
      unitQuantity3Field,

    ]);

    initialRMField.updateInitialValue(calculate1RM(percent75: false).toStringAsFixed(0));
    unitQuantity1Field.updateInitialValue(calculate1RM(percent75: true).toStringAsFixed(0));
    unitQuantity2Field.updateInitialValue(calculate1RM(percent75: true).toStringAsFixed(0));
    unitQuantity3Field.updateInitialValue(calculate1RM(percent75: true).toStringAsFixed(0));

    quantity1Field.onValueChanges(onData: (previous, current) async* {
      exerciseRepository.setQuantity(current.valueToDouble);
      exerciseRepository.setUnitQuantity(unitQuantity1Field.valueToDouble);
    });

    quantity2Field.onValueChanges(onData: (previous, current) async* {
      exerciseRepository.setQuantity(current.valueToDouble);
      exerciseRepository.setUnitQuantity(unitQuantity2Field.valueToDouble);
    });

    quantity3Field.onValueChanges(onData: (previous, current) async* {
      exerciseRepository.setQuantity(current.valueToDouble);
      exerciseRepository.setUnitQuantity(unitQuantity3Field.valueToDouble);
    });

    times = percentToCalculate == 0.5 ? "30-35" : "12";

  }

  @override
  void onLoading() {
    step = 1;
    super.onLoading();
  }

  @override
  void onSubmitting() async {
    print("on Submitting Custom form");
    try {
      emitLoading(progress: 30);
      if ( step == 1) {

        //unitQuantity2Field.updateInitialValue(calculate1RM(percent75: true).toStringAsFixed(0));
        //unitQuantity3Field.updateInitialValue(calculate1RM(percent75: true).toStringAsFixed(0));
        step = 2;
      } else if ( step == 2) {
        //unitQuantity3Field.updateInitialValue(calculate1RM(percent75: true).toStringAsFixed(0));
        step = 3;
      } else if ( step == 3 ) {
        //updatedRMField.updateInitialValue(calculate1RM(percent75: false).toStringAsFixed(0));
      }

      if ( ! readonly ) {
        await exerciseRepository.addExercise();
      }

      emitSuccess(canSubmitAgain: true);
    } on Exception catch (ex) {
      emitFailure(failureResponse: ex.toString());
    }
  }

  double calculate1RM({bool percent75}) {
    if (exerciseRepository.exercise == null) {
      exerciseRepository.getLastExercise();
    }
    double weight = exerciseRepository.exercise.unitQuantity;
    double repeat = exerciseRepository.exercise.quantity;
    if ( weight == 0 || repeat == 0) {
      return 0;
    }

    double rmWendler = weight * repeat * 0.0333 + weight;
    double rmOconner = weight * (1 + repeat / 40);
    double average = (rmWendler + rmOconner) / 2;

    return percent75 ?  average * this.percentToCalculate : average;
  }

  //@override
  Future<void> close() {
    initialRMField.close();
    quantity1Field.close();
    unitQuantity1Field.close();
    quantity2Field.close();
    unitQuantity2Field.close();
    quantity3Field.close();
    unitQuantity3Field.close();

    return super.close();
  }
}