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

export async function handleGetMessagesSince(query: GetMessagesSinceQuery, dataSource: DataSource) {
  const repo = dataSource.getRepository(MessageEntity);
  const { roomId, sinceTimestamp } = query.payload;
  const currentUserId = await getCurrentUserScope(dataSource);

  if (!currentUserId) {
    return [];
  }

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

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