import { DataSource } from 'typeorm';
import { MessageEntity } from '../../../entities';
import { GetMessagesQuery } from '../../types';
import { rowToMessage } from '../../mappers';
import { loadMessageReactionsMap } from '../../relations';
import { getCurrentUserScope } from '../../current-user-scope';

export async function handleGetMessages(query: GetMessagesQuery, dataSource: DataSource) {
  const repo = dataSource.getRepository(MessageEntity);
  const { roomId, limit = 100, offset = 0 } = query.payload;
  const currentUserId = await getCurrentUserScope(dataSource);

  if (!currentUserId) {
    return [];
  }

  const rows = await repo.find({
    where: { roomId, ownerUserId: currentUserId },
    order: { timestamp: 'ASC' },
    take: limit,
    skip: offset
  });
  const reactionsByMessageId = await loadMessageReactionsMap(dataSource, rows.map((row) => row.id));

  return rows.map((row) => rowToMessage(row, reactionsByMessageId.get(row.id) ?? []));
}
