import { ConnectedSocket, MessageBody, SubscribeMessage, WebSocketGateway, WebSocketServer } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';

@WebSocketGateway({ cors: { origin: '*' } })
export class OrdersGateway {
  @WebSocketServer() server!: Server;

  emitOrderEvent(event: string, payload: unknown) {
    this.server.emit(event, payload);
  }

  emitToOrder(orderId: string, event: string, payload: unknown) {
    this.server.to(`order:${orderId}`).emit(event, payload);
    this.server.to('role:ADMIN').emit(event, payload);
    this.server.to('role:SUPER_ADMIN').emit(event, payload);
  }

  emitToUser(userId: string, event: string, payload: unknown) {
    this.server.to(`user:${userId}`).emit(event, payload);
  }

  emitToRole(role: string, event: string, payload: unknown) {
    this.server.to(`role:${role}`).emit(event, payload);
  }

  @SubscribeMessage('orders.subscribe')
  subscribeOrder(@MessageBody() body: { orderId: string }, @ConnectedSocket() client: Socket) {
    client.join(`order:${body.orderId}`);
    return { ok: true };
  }

  @SubscribeMessage('users.subscribe')
  subscribeUser(@MessageBody() body: { userId: string }, @ConnectedSocket() client: Socket) {
    client.join(`user:${body.userId}`);
    return { ok: true };
  }

  @SubscribeMessage('roles.subscribe')
  subscribeRole(@MessageBody() body: { role: string }, @ConnectedSocket() client: Socket) {
    client.join(`role:${body.role}`);
    return { ok: true };
  }
}
