// src/server/shared/lib/events.ts
// Centralized EventEmitter for inter-slice communication (VSA Rule 2.1)

import { EventEmitter } from 'events';
import { loggerService } from './logger';

// Initialize logger for events
const eventsLogger = loggerService.get('SYSTEM');

/**
 * Centralized EventEmitter for cross-slice communication.
 * 
 * Usage:
 * - Emit events: emitter.emit('employee:fired', { employeeId, reason })
 * - Listen to events: emitter.on('employee:fired', (data) => { ... })
 * - Clean up: emitter.off('employee:fired', handler)
 * 
 * Event naming convention: 'resource:action' (e.g., 'employee:fired', 'note:created')
 */
export const emitter = new EventEmitter();

// Increase max listeners to prevent memory leak warnings
emitter.setMaxListeners(50);

/**
 * Type-safe event emitter wrapper
 */
export type EventHandler<T = any> = (data: T) => void | Promise<void>;

/**
 * Register event listener with automatic cleanup support
 */
export function onEvent<T = any>(event: string, handler: EventHandler<T>): () => void {
  emitter.on(event, handler);
  
  // Return cleanup function
  return () => emitter.off(event, handler);
}

/**
 * Emit event with error handling
 */
export async function emitEvent<T = any>(event: string, data: T): Promise<boolean> {
  try {
    emitter.emit(event, data);
    return true;
  } catch (error) {
    eventsLogger.error(`Error emitting event "${event}":`, error);
    return false;
  }
}
