import 'package:get/get.dart';
import 'package:kaer_with_panels/app/utils/kr_log_util.dart';

/// 消息类型枚举
enum KRMessageType {
  kr_payment,    
  kr_subscribe_update,
 
}

/// 消息数据类
class KRMessageData {
  final KRMessageType kr_type;        // 消息类型
  final Map<String, dynamic> kr_data;  // 消息数据

  KRMessageData({
    required this.kr_type,
    required this.kr_data,
  });
}

/// 消息总线工具类
class KREventBus {
  // 单例模式
  static final KREventBus _instance = KREventBus._internal();
  factory KREventBus() => _instance;
  KREventBus._internal();

  // 消息流控制器
  final _kr_messageController = Rx<KRMessageData?>(null);

  /// 发送消息
  void kr_sendMessage(
    KRMessageType type, {
    Map<String, dynamic> data = const {},
  }) {
    _kr_messageController.value = KRMessageData(
      kr_type: type,
      kr_data: data,
    );
  }

  /// 监听特定类型的消息
  /// 返回 Worker 对象，可用于手动取消订阅
  /// 在控制器的 onClose 方法中调用 worker.dispose() 来取消订阅
  /// 示例：
  /// ```dart
  /// class MyController extends GetxController {
  ///   Worker? _worker;
  ///
  ///   @override
  ///   void onInit() {
  ///     super.onInit();
  ///     _worker = KREventBus().kr_listenMessage(
  ///       KRMessageType.kr_paymentSuccess,
  ///       (message) => KRLogUtil.kr_d('收到消息: $message', tag: 'EventBus'),
  ///     );
  ///   }
  ///
  ///   @override
  ///   void onClose() {
  ///     _worker?.dispose();
  ///     super.onClose();
  ///   }
  /// }
  /// ```
  Worker kr_listenMessage(
    KRMessageType type,
    Function(KRMessageData) callback,
  ) {
    return ever(_kr_messageController, (KRMessageData? message) {
      if (message != null && message.kr_type == type) {
        callback(message);
      }
    });
  }

  /// 监听多个类型的消息
  /// 返回 Worker 对象，可用于手动取消订阅
  /// 在控制器的 onClose 方法中调用 worker.dispose() 来取消订阅
  Worker kr_listenMessages(
    List<KRMessageType> types,
    Function(KRMessageData) callback,
  ) {
    return ever(_kr_messageController, (KRMessageData? message) {
      if (message != null && types.contains(message.kr_type)) {
        callback(message);
      }
    });
  }

  /// 监听所有消息
  /// 返回 Worker 对象，可用于手动取消订阅
  /// 在控制器的 onClose 方法中调用 worker.dispose() 来取消订阅
  Worker kr_listenAllMessages(Function(KRMessageData) callback) {
    return ever(_kr_messageController, (KRMessageData? message) {
      if (message != null) {
        callback(message);
      }
    });
  }
}