import 'package:comwell_key_app/base/base_cubit.dart';
import 'package:comwell_key_app/domain/models/app_error.dart';
import 'package:comwell_key_app/domain/models/notification_permission.dart';
import 'package:comwell_key_app/domain/repositories/notifications_repository.dart';
import 'package:comwell_key_app/presentation/screens/notifications/bloc/notifications_state.dart';

class NotificationsCubit extends BaseCubit<NotificationsState> {
  final NotificationsRepository _notificationsRepository;

  NotificationsCubit(this._notificationsRepository) : super(const NotificationsState()) {
    init();
  }

  // List of permission types that should be shown in the UI
  final List<NotificationPermissionType> _visiblePermissionTypes = [
    NotificationPermissionType.appNotifications,
    NotificationPermissionType.ccSms,
    NotificationPermissionType.ccDigital,
    NotificationPermissionType.ccEmail,
  ];

  void init() async {
    try {
      safeEmit(state.loading());
      final notifications = await _notificationsRepository.fetchNotificationPermissions();
      final visible = notifications
          .where(
            (permission) => _visiblePermissionTypes.any(
              (type) => type.code == permission.code,
            ),
          )
          .toList();
      safeEmit(state.copyWith(allNotifications: visible));
    } catch (e, st) {
      logError(e, st);
      safeEmit(state.copyWith(error: AppError.unknown(e.toString())));
    } finally {
      safeEmit(state.copyWith(isLoading: false));
    }
  }

  void onNotificationPermissionClicked(String name) {
    final notificationPermissions = state.allNotifications
        .map(
          (permission) => permission.displayName == name
              ? permission.copyWith(
                  given: !permission.given,
                  notificationPermissionDescription: permission.notificationPermissionDescription,
                )
              : permission,
        )
        .toList();
    safeEmit(state.copyWith(allNotifications: notificationPermissions));
  }

  void updateAllPermissionsUI(bool value) {
    final notificationPermissions = state.allNotifications
        .map(
          (permission) => permission.copyWith(
            given: value,
            notificationPermissionDescription: permission.notificationPermissionDescription,
          ),
        )
        .toList();
    safeEmit(state.copyWith(allNotifications: notificationPermissions));
  }

  void updatePreferences(List<NotificationPermission> notificationPermissions) async {
    await _notificationsRepository.updateNotificationPreferences(notificationPermissions);
    safeEmit(state.copyWith(allNotifications: notificationPermissions));
  }

  void fetchNotificationPermissions() async {
    final notificationPermissions = await _notificationsRepository.fetchNotificationPermissions();
    safeEmit(state.copyWith(allNotifications: notificationPermissions));
  }
}