import 'package:flutter/material.dart';

import 'package:logging/logging.dart';

import 'package:pshared/models/auth/pending_login.dart';
import 'package:pshared/provider/account.dart';
import 'package:pshared/service/verification.dart';


class TwoFactorProvider extends ChangeNotifier {
  static final _logger = Logger('provider.two_factor');
  late AccountProvider _accountProvider;

  TwoFactorProvider();

  bool _isSubmitting = false;
  bool _hasError = false;
  bool _verificationSuccess = false;
  String? _errorMessage;

  bool get isSubmitting => _isSubmitting;
  bool get hasError => _hasError;
  bool get verificationSuccess => _verificationSuccess;
  String? get errorMessage => _errorMessage;
  PendingLogin? get pendingLogin => _accountProvider.pendingLogin;

  void update(AccountProvider accountProvider) {
    _accountProvider = accountProvider;
  }

  Future<void> submitCode(String code) async {
    _isSubmitting = true;
    _hasError = false;
    _errorMessage = null;
    _verificationSuccess = false;
    notifyListeners(); 

    try {
      final pending = _accountProvider.pendingLogin;
      if (pending == null) {
        throw Exception('No pending login available');
      }
      final account = await VerificationService.confirmLoginCode(
        pending: pending,
        code: code,
      );
      _accountProvider.completePendingLogin(account);
      _verificationSuccess = true;
    } catch (e) {
      _hasError = true;
      _errorMessage = e.toString();
      _logger.warning('Failed to verify code: ${e.toString()}', e);
    } finally {
      _isSubmitting = false;
      notifyListeners();
    }
  }

  Future<void> resendCode() async {
    final pending = _accountProvider.pendingLogin;
    if (pending == null) {
      _logger.warning('No pending login to resend code for');
      return;
    }
    try {
      await VerificationService.resendLoginCode(pending);
    } catch (e) {
      _logger.warning('Failed to resend login code', e);
      _hasError = true;
      _errorMessage = e.toString();
      notifyListeners();
    }
  }
}