import 'dart:async';

import 'package:aitrainer_app/localization/app_language.dart';
import 'package:aitrainer_app/localization/app_localization.dart';
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/cupertino.dart';
import 'package:meta/meta.dart';

part 'settings_event.dart';
part 'settings_state.dart';

class SettingsBloc extends Bloc<SettingsEvent, SettingsState> {
  String language;
  Locale _locale;
  BuildContext context;

  SettingsBloc({this.context}) : super(SettingsInitial());

  void setLocale(Locale locale) {
    _locale = locale;
  }

  Locale getLocale() {
    return _locale;
  }

  @override
  Stream<SettingsState> mapEventToState(
    SettingsEvent event,
  ) async* {
    if (event is SettingsChangeLanguage) {
      yield SettingsLoading();
      await _changeLang( event.language);
      yield SettingsReady(_locale);
    } else if ( event is SettingsGetLanguage) {
      await AppLanguage().fetchLocale();
      _locale = AppLanguage().appLocal;
      yield SettingsReady(_locale);
    }
  }

  Future<void> _changeLang( String lang ) async{
    print("_change to $lang");
    switch ( lang ) {
      case "English":
      case "en":
      case "Angol":
        _locale = Locale('en');
        break;
      case "Hungarian":
      case "Magyar":
      case "hu":
        _locale = Locale('hu');
        break;
    }
    this.language = lang;
    AppLanguage().changeLanguage(_locale);
    await loadLang();
  }

  Future<void> loadLang() async{
    if ( _locale != null ) {
      print(" -- Loading lang $_locale");
      if (context != null) {
        AppLocalizations.of(context).setLocale(_locale);
        await AppLocalizations.of(context).load();
      } else {
        print("no context, does not load");
      }
    } else {
      print("no locale, does not load");
    }
  }
}