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

class CustomerChangeFormBloc extends FormBloc<String, String> {
  final CustomerRepository customerRepository;

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

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

  final nameField = TextFieldBloc();
  final passwordField = TextFieldBloc(
    validators: [
      //FieldBlocValidators.confirmPassword(passwordField),
    ],
  );
  final birthYearField = TextFieldBloc();
  final weightField = TextFieldBloc();
  final genderField = SelectFieldBloc();

  final goalField = TextFieldBloc();

  CustomerChangeFormBloc({this.customerRepository}) {
    addFieldBlocs(fieldBlocs: [
        emailField,
        firstNameField,
        nameField,
        passwordField,
        birthYearField,
        weightField,
        genderField,

        goalField,
      ]);

    emailField.updateInitialValue(customerRepository.customer.email);
    firstNameField.updateInitialValue(customerRepository.customer.firstname);
    nameField.updateInitialValue(customerRepository.customer.name);
    birthYearField.updateInitialValue(customerRepository.customer.birthYear.toString());
    weightField.updateInitialValue(customerRepository.customer.weight.toString());
    genderField.updateInitialValue(customerRepository.getGenderByDBValue(customerRepository.sex));

    firstNameField.onValueChanges(onData: (previous, current) async* {
      customerRepository.setFirstName(current.value);
    });
    nameField.onValueChanges(onData: (previous, current) async* {
      customerRepository.setName(current.value);
    });
    birthYearField.onValueChanges(onData: (previous, current) async* {
      customerRepository.setBirthYear(current.valueToInt);
    });
    weightField.onValueChanges(onData: (previous, current) async* {
      customerRepository.setWeight(current.valueToInt);
    });

    customerRepository.genders.forEach((element) {
      genderField.addItem(element.name);
    });

    genderField.onValueChanges(onData: (previous, current) async* {
      String dbValue = customerRepository.getGenderByName(current.value);
      customerRepository.setSex(dbValue);
    });


  }

  @override
  void onSubmitting() async {
    print("on Submitting Custom form");
    try {
      emitLoading(progress: 30);
      // Emit either Loaded or Error
      await customerRepository.saveCustomer();
      emitSuccess(canSubmitAgain: false);
    } on Exception catch (ex) {
      emitFailure(failureResponse: ex.toString());
    }
  }

  @override
  Future<void> close() {
    emailField.close();
    firstNameField.close();
    nameField.close();
    passwordField.close();
    birthYearField.close();
    weightField.close();
    genderField.close();
    return super.close();
  }

}