// src/server/features/rooms/rooms.events.ts
// Event listeners for rooms module - handles Socket.io notifications

import { emitter, onEvent } from '../../shared/lib/events';
import { logger } from '../../shared/lib/logger';
import { notifyAdmins, notifyManagers } from '../../shared/plugins/socket';

/**
 * Event payload types for rooms events
 */
export interface RoomCreatedEvent {
  roomId: string;
  room: any;
}

export interface RoomUpdatedEvent {
  roomId: string;
  room: any;
  oldId?: string;
}

export interface RoomDeletedEvent {
  roomId: string;
}

/**
 * Register all room event listeners
 * Call this once during application initialization
 */
export function registerRoomEventListeners(): void {
  // Listen for room:created events
  onEvent<RoomCreatedEvent>('room:created', async (data) => {
    try {
      logger.info(`[Events] room:created received for room ${data.roomId}`);
      await notifyAdmins('notification:new', {
        type: 'room_created',
        message: `Новый номер создан: ${data.roomId}`,
        data: data.room,
      });
    } catch (error) {
      logger.error(`[Events] Error handling room:created:`, error);
    }
  });

  // Listen for room:updated events
  onEvent<RoomUpdatedEvent>('room:updated', async (data) => {
    try {
      logger.info(`[Events] room:updated received for room ${data.roomId}`);
      
      const message = data.oldId 
        ? `Номер переименован: ${data.oldId} → ${data.roomId}`
        : `Номер обновлен: ${data.roomId}`;
      
      await notifyAdmins('notification:new', {
        type: 'room_updated',
        message,
        data: data.room,
      });
    } catch (error) {
      logger.error(`[Events] Error handling room:updated:`, error);
    }
  });

  // Listen for room:deleted events
  onEvent<RoomDeletedEvent>('room:deleted', async (data) => {
    try {
      logger.info(`[Events] room:deleted received for room ${data.roomId}`);
      await notifyAdmins('notification:new', {
        type: 'room_deleted',
        message: `Номер удален: ${data.roomId}`,
        data: { roomId: data.roomId },
      });
    } catch (error) {
      logger.error(`[Events] Error handling room:deleted:`, error);
    }
  });

  logger.info('[Events] Room event listeners registered successfully');
}

/**
 * Helper function to emit room:created event
 */
export async function emitRoomCreatedEvent(data: RoomCreatedEvent): Promise<void> {
  await emitter.emit('room:created', data);
}

/**
 * Helper function to emit room:updated event
 */
export async function emitRoomUpdatedEvent(data: RoomUpdatedEvent): Promise<void> {
  await emitter.emit('room:updated', data);
}

/**
 * Helper function to emit room:deleted event
 */
export async function emitRoomDeletedEvent(data: RoomDeletedEvent): Promise<void> {
  await emitter.emit('room:deleted', data);
}
