import 'package:comwell_key_app/authentication/authentication_repository.dart';
import 'package:comwell_key_app/presentation/app/bloc/app_cubit.dart';
import 'package:comwell_key_app/presentation/base/base_cubit.dart';
import 'package:comwell_key_app/presentation/screens/login/bloc/login_state.dart';
import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:flutter/cupertino.dart';
import 'package:go_router/go_router.dart';
import 'package:msal_auth/msal_auth.dart';

class LoginCubit extends BaseCubit<LoginState> {
  LoginCubit(
    this._authRepository,
    this._appCubit, {
    required this.forced,
    required this.redirectAfterLogin,
  }) : super(const LoginState()) {
    init();
  }

  final AuthenticationRepository _authRepository;
  final AppCubit _appCubit;
  final bool forced;
  final String redirectAfterLogin;

  Future<void> init() async {
    if (forced) {
      await _authRepository.logOut();
    }
  }

  bool get isLoggedId => _authRepository.isLoggedIn;

  Future<void> login(BuildContext context) async {
    if (!_authRepository.isLoggedIn) {
      await _authRepository.openAuth(Prompt.login);
    }
    if (context.mounted) redirect(context);
  }

  Future<void> createAccount() async {
    await _authRepository.openAuth(Prompt.create);
  }

  void redirect(BuildContext context) async {
    context.go(AppRoutes.overview);
    if (redirectAfterLogin.isNotEmpty) {
      // wait for previous nav to finish
      await Future<void>.delayed(const Duration(milliseconds: 500));
      // We navigate via deeplink handler to ensure we have a valid context
      _appCubit.navigate(Uri.parse(redirectAfterLogin));
    }
  }
}