import 'package:aitrainer_app/bloc/account/account_bloc.dart';
import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/repository/exercise_repository.dart';
import 'package:aitrainer_app/repository/user_repository.dart';
import 'package:aitrainer_app/service/exercise_tree_service.dart';
import 'package:aitrainer_app/service/exercisetype_service.dart';
import 'package:aitrainer_app/service/property_service.dart';
import 'package:aitrainer_app/util/common.dart';
import 'package:flutter_form_bloc/flutter_form_bloc.dart';

class LoginFormBloc extends FormBloc<String, String> with Common {
  final AccountBloc accountBloc;
  final UserRepository userRepository;

  final emailField = TextFieldBloc(
    validators: [
      FieldBlocValidators.required,
    ],
  );
  final passwordField = TextFieldBloc(validators: [
    FieldBlocValidators.required,
  ]);

  LoginFormBloc({this.userRepository, this.accountBloc}) {
    addFieldBlocs(fieldBlocs: [emailField, passwordField]);

    emailField.onValueChanges(onData: (previous, current) async* {
      userRepository.setEmail(current.value);
    });

    passwordField.onValueChanges(onData: (previous, current) async* {
      userRepository.setPassword(current.value);
    });
  }

  @override
  void onSubmitting() async {
    try {
      emitLoading(progress: 30);
      if (!validateEmail(userRepository)) {
        emailField.addFieldError(EMAIL_ERROR, isPermanent: true);

        emitFailure(failureResponse: EMAIL_ERROR);
      } else if (!validatePassword(userRepository)) {
        passwordField.addFieldError(PASSWORD_ERROR, isPermanent: true);
        emitFailure(failureResponse: PASSWORD_ERROR);
      } else {
        // Emit either Loaded or Error
        await PropertyApi().getProperties();
        print("properties OK");
        await userRepository.getUser();
        print("get User OK");
        await ExerciseTypeApi().getExerciseTypes();
        print("exerciesTypes OK");
        await ExerciseTreeApi().getExerciseTree();
        if (Cache().userLoggedIn != null && Cache().userLoggedIn.customerId > 0) {
          ExerciseRepository exerciseRepository = ExerciseRepository();
          await exerciseRepository.getExercisesByCustomer(Cache().userLoggedIn.customerId);
        }
        emitSuccess(canSubmitAgain: false);
        accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn));
      }
    } on Exception catch (ex) {
      emitFailure(failureResponse: ex.toString());
    }
  }
}