import 'dart:async';

import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/model/customer.dart';
import 'package:aitrainer_app/repository/customer_repository.dart';
import 'package:aitrainer_app/repository/exercise_repository.dart';
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:meta/meta.dart';

part 'account_event.dart';
part 'account_state.dart';

class AccountBloc extends Bloc<AccountEvent, AccountState> {
  final CustomerRepository customerRepository;
  bool loggedIn = false;
  int traineeId = 0;
  AccountBloc({this.customerRepository}) : super(AccountInitial()) {
    if ( Cache().userLoggedIn != null ) {
      customerRepository.customer = Cache().userLoggedIn;
      loggedIn = true;
    }
  }

  @override
  Stream<AccountState> mapEventToState(
    AccountEvent event,
  ) async* {
    try {
      if (event is AccountChangeCustomer) {
        // route to Customer Change page
        yield AccountReady();
      } else if (event is AccountLogin) {
        //route to Login Page
      } else if (event is AccountLogInFinished) {
        customerRepository.customer = event.customer;
        this.loggedIn = true;
        yield AccountLoggedIn();
      } else if (event is AccountLogout) {
        await Cache().logout();
        customerRepository.customer = null;
        customerRepository.emptyTrainees();
        loggedIn = false;
        yield AccountLoggedOut();
      } else if ( event is AccountGetTrainees) {
        yield AccountLoading();
        await customerRepository.getTrainees();
        yield AccountReady();
      } else if ( event is AccountSelectTrainee ) {
        yield AccountLoading();
        customerRepository.setTrainee(event.traineeId);
        Cache().setTrainee(customerRepository.getTraineeById(event.traineeId));
        ExerciseRepository exerciseRepository = ExerciseRepository();
        await exerciseRepository.getExercisesByCustomer(event.traineeId);
        this.traineeId = event.traineeId;
        yield AccountReady();
      }
    } on Exception catch(e) {
      yield AccountError(message: e.toString());
    }
  }
}