// user.listener.ts
import { Message } from '@/entities/message.entity';
import { Injectable } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';

@Injectable()
export class MessagesEventService {
  public static EVENTS = {
    GET_CONVERSATIONS: 'messages.get-conversations',
    GET_CONVERSATION: 'messages.get-conversation',
    RECEIVE_CONVERSATIONS: 'messages.receive-conversations',
    RECEIVE_CONVERSATION: 'messages.receive-conversation',
    SEND_MESSAGE: 'messages.send-messsage',
    REPLY_MESSAGE: 'messages.reply-messsage',
  };

  public static LOCAL_EVENTS = {
    GET_CONVERSATIONS: 'local_messages.get-conversations',
    GET_CONVERSATION: 'local_messages.get-conversation',
    RECEIVE_CONVERSATIONS: 'local_messages.receive-conversations',
    RECEIVE_CONVERSATION: 'local_messages.receive-conversation',
    SEND_MESSAGE: 'local_messages.send-messsage',
    REPLY_MESSAGE: 'local_messages.reply-messsage',
  };

  constructor(
    private event: EventEmitter2,
    @InjectRepository(Message)
    readonly repo: Repository<Message>,
  ) {}

  public async waitForEvent<T>(
    eventName: string,
    timeoutMs = 10000,
  ): Promise<T> {
    return new Promise((resolve, reject) => {
      const timer = setTimeout(() => {
        this.event.off(eventName, listener); // cleanup
        resolve(null); // hoặc reject(new Error('Timeout')) nếu muốn
      }, timeoutMs);

      const listener = (data: any) => {
        clearTimeout(timer);
        this.event.off(eventName, listener); // cleanup
        resolve(data);
      };

      this.event.on(eventName, listener);
    });
  }

  public async sendEvent<T>(eventName: string, data: T) {
    return this.event.emit(eventName, data);
  }
}
