import 'dart:async';

import 'package:common/services/msal_service.dart';
import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/tracking/comwell_tracking.dart';
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:msal_auth/msal_auth.dart';

import '../utils/seos_repository.dart';

class AuthenticationRepository {
  final SeosRepository _seosRepository;
  final ComwellDatabase _database;
  final ComwellTracking _comwellTracking;
  final MSALService _msalService;

  AuthenticationRepository(
    this._seosRepository,
    this._database,
    this._comwellTracking,
    this._msalService,
  ) {
    FirebaseAnalytics.instance.setUserProperty(
      name: 'login_status',
      value: 'false',
    );
  }

  bool get isLoggedIn => _msalService.isLoggedIn;

  Future<void> logOut() async {
    try {
      await _msalService.logout();
      _comwellTracking.trackEvent('logout');
      await _seosRepository.terminateEndpoint();
      await _database.deleteDatabase();
      await secureStorage.deleteAll();
      await FirebaseAnalytics.instance.setUserProperty(
        name: 'login_status',
        value: 'false',
      );
    } catch (e) {
      // no op
    }
  }

  Future<void> openAuth(Prompt prompt) async {
    await _msalService.openAuth(prompt);
    await FirebaseAnalytics.instance.logLogin();
    await FirebaseAnalytics.instance.setUserProperty(
      name: 'login_status',
      value: 'true',
    );
  }

  Future<String> getAccessToken() async {
    return await _msalService.acquireTokenSilent();
  }
}