processUIEvent method

Future<void> processUIEvent(
  1. ObslyEventBase event
)

Execute rules for UI events with fresh appContext

Implementation

Future<void> processUIEvent(ObslyEventBase event) async {
  if (!_isAvailable || !_isExecutionEnabled) return;

  final rulesStartTime = DateTime.now();
  ObslyLogger.verboseDetails('RULES', 'πŸ”§ Rules processing started');

  const elementId = 'Unknown Element';
  const action = 'Unknown Action';

  try {
    final uiContext = _extractUIContext(event);
    if (uiContext != null) {
      final contextElementId = uiContext['elementId'] ?? elementId;
      final contextAction = uiContext['action'] ?? action;

      // Log UI rule processing in verbose mode
      ObslyLogger.verbose('πŸ–±οΈ UI Event: $contextAction on $contextElementId');
      ObslyLogger.verbose('🎯 Starting UI rule evaluation: $contextElementId ($contextAction)');

      // Build fresh appContext for this evaluation
      final currentAppContext = _buildCurrentAppContext();

      // Log context access for debugging (only in verbose mode)
      ObslyLogger.verboseDetails('RULES', 'UI Rule context access: app_context');

      // Merge UI context with app context
      final fullContext = {
        ...currentAppContext,
        'event': {
          'click': contextElementId,
          'domPath': uiContext['widgetPath'] ?? '',
          'action': contextAction,
          if (uiContext['metadata'] != null) ...uiContext['metadata'],
        },
      };

      // Log the merged context in verbose mode
      ObslyLogger.verbose('πŸ—‚οΈ UI Rule merged context prepared');
      ObslyLogger.verbose('πŸ” CONTEXT SENT TO RULES ENGINE:');
      ObslyLogger.verbose('  event.click = "${fullContext['event']?['click']}"');
      ObslyLogger.verbose('  uiContext.elementId = "$contextElementId"');

      // Use unified execution method
      final results = await RulesManager.instance.executeRulesForEvent(
        eventType: 'ui',
        context: fullContext,
      );

      // Log results with consolidated summary
      final allTags = results
          .expand((r) => RulesResultFormatter.formatForUI(r.rawResult, includeTimestamp: false)['tags']
              as List<Map<String, dynamic>>)
          .toList();
      final allVariables = results
          .expand((r) => RulesResultFormatter.formatForUI(r.rawResult, includeTimestamp: false)['variables']
              as List<Map<String, dynamic>>)
          .toList();

      final rulesDuration = DateTime.now().difference(rulesStartTime);

      // Consolidated rule execution summary
      ObslyLogger.debugSummary('UI Rules', {
        'element': contextElementId,
        'action': contextAction,
        'rules_executed': results.length,
        'tags_generated': allTags.length,
        'variables_set': allVariables.length,
        'duration_ms': rulesDuration.inMilliseconds,
        'status': results.isNotEmpty ? 'SUCCESS' : 'NO_RESULTS',
      });

      // Detailed logging in verbose mode
      final resultStatus = results.isNotEmpty ? 'βœ… SUCCESS' : '❌ NO RESULTS';
      ObslyLogger.verbose('🏁 UI Rules result: $resultStatus | Rules: ${results.length} | Tags: ${allTags.length} | Variables: ${allVariables.length}');
    }
  } catch (e, stackTrace) {
    final rulesDuration = DateTime.now().difference(rulesStartTime);
    ObslyLogger.verboseDetails('RULES', 'πŸ”§ Rules processing failed after: ${rulesDuration.inMilliseconds}ms');
    ObslyLogger.errorWithContext(
      'RulesIntegration',
      'processUIEvent',
      e.toString(),
      stackTrace,
      context: {'elementId': elementId, 'action': action},
    );
  }
}