import 'dart:core';
import 'package:bloc/bloc.dart';
import 'package:comwell_key_app/domain/repositories/booking_details_repository.dart';
import 'package:comwell_key_app/key/repository/key_repository.dart';
import 'package:comwell_key_app/utils/seos_repository.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/foundation.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:seos_mobile_keys_plugin/app_usage_api.dart';

part 'key_event.dart';

part 'key_state.dart';

class KeyBloc extends Bloc<KeyEvent, KeyState> {
  final KeyRepository keyRepository;
  final BookingDetailsRepository bookingDetailsRepository;
  final SeosRepository seosRepository;

  KeyBloc({
    required this.seosRepository,
    required this.keyRepository,
    required this.bookingDetailsRepository,
  }) : super(KeyState.unknown()) {
    on<SearchForKeys>((event, emit) async {
      emit(KeyState.searchForKeys());
      try {
        final keys = await seosRepository.refreshKeys();
        emit(KeyState.validKeys(keys));
        add(const StartScanning());
      } catch (e, st) {
        if (!kDebugMode) Sentry.captureException(e, stackTrace: st);
        emit(KeyState.searchForKeysError(e.toString()));
      }
    });

    on<StartScanning>((event, emit) async {
      try {
        await keyRepository.checkDeviceInfo();
        emit(KeyState.scanning());

        // for (var i = 0; i < 10; i++) {
        //   try {
        //     print("qqq start scanning=$i");
        //     await Future.delayed(const Duration(seconds: 1));
        //     await keyRepository.openClosestReader();
        //     print("qqq openClosestReader=$i");
        //     keyRepository.stopScanning();
        //     emit(KeyState.openClosestReaderSuccess());
        //     break;
        //   } catch (e) {
        //     print("qqq failed, rescanning");
        //     continue;
        //     emit(KeyState.openClosestReaderError(e.toString()));
        //   }
        // }
      } catch (e, st) {
        if (!kDebugMode) Sentry.captureException(e, stackTrace: st);
        emit(KeyState.scanningError(e.toString()));
      }
    });

    on<SetRootOpeningTrigger>((event, emit) async {
      try {
        await keyRepository.setRootOpeningTrigger();
      } catch (e, st) {
        if (!kDebugMode) Sentry.captureException(e, stackTrace: st);
        emit(KeyState.setRootOpeningTriggerError(e.toString()));
      }
    });

    on<RemoveRootOpeningTrigger>((event, emit) async {
      try {
        await keyRepository.removeRootOpeningTrigger();
      } catch (e, st) {
        if (!kDebugMode) Sentry.captureException(e, stackTrace: st);
        emit(KeyState.removeRootOpeningTriggerError(e.toString()));
      }
    });

    add(SearchForKeys());
  }
}