import { NotificationEventType, WSConnentRequest } from '@core/types'
import { Logger } from '@nestjs/common'
import { MessageBody, OnGatewayDisconnect, SubscribeMessage, WebSocketGateway, WsResponse } from '@nestjs/websockets'
import { Observable, filter, map } from 'rxjs'
import { EventService } from '../../global'

@WebSocketGateway(3001, { cors: { origin: '*' } })
export class WSGateway implements OnGatewayDisconnect {
	private logger = new Logger(WSGateway.name)

	constructor(private readonly _eventService: EventService) {}

	@SubscribeMessage('events')
	onEvent(
		@MessageBody() request: WSConnentRequest,
	): Observable<WsResponse<{ event: NotificationEventType; userId?: string }>> {
		this.logger.debug('WebSocket client has been connected')

		return this._eventService.event$.pipe(
			filter(({ tenantId }) => tenantId === request.tenantId),
			map(({ type, userId }) => ({ event: 'events', data: { event: type, userId } })),
		)
	}

	handleDisconnect(): void {
		this.logger.debug('WebSocket client has been disconnected')
	}
}
