import 'dart:async';

import 'package:aitrainer_app/bloc/settings/settings_bloc.dart';
import 'package:aitrainer_app/service/firebase_api.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/service/logging.dart';
import 'package:aitrainer_app/util/session.dart';
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:upgrader/upgrader.dart';

part 'session_event.dart';
part 'session_state.dart';

class SessionBloc extends Bloc<SessionEvent, SessionState> with Logging {
  final Session session;
  StreamSubscription? _sub;
  SettingsBloc? settingsBloc;

  SessionBloc({required this.session}) : super(SessionInitial()) {
    on<SessionStart>(_onStart);
  }

  void _onStart(SessionStart event, Emitter<SessionState> emit) async {
    log(" -------- Session starting...");
    emit(SessionLoading());

    try {
      this.settingsBloc = event.settingsBloc;
      await session.fetchSessionAndNavigate();
      FirebaseApi().setupRemoteConfig();
      String lang = AppLanguage().appLocal.languageCode;
      log("Change lang to $lang");
      settingsBloc!.add(SettingsChangeLanguage(language: lang));
      final iTunes = ITunesSearchAPI();
      final resultsFuture = iTunes.lookupByBundleId('com.aitrainer.app');
      resultsFuture.then((results) {
        print('iTunes results: $results');
      });
      emit(SessionReady());
    } on Exception catch (e) {
      emit(SessionFailure(message: e.toString()));
    }
  }

  @override
  Future<void> close() async {
    await this.close();
    _sub?.cancel();
    settingsBloc?.close();
    super.close();
  }
}