import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { UsersService } from '../users/users.service';
import { SendLobbyMessageDto } from './dto/send-lobby-message.dto';
import { LobbyMessage } from './entities/lobby-message.entity';

@Injectable()
export class LobbyService {
  constructor(
    private readonly usersService: UsersService,
    @InjectRepository(LobbyMessage)
    private readonly lobbyMessagesRepository: Repository<LobbyMessage>,
  ) {}

  async getMainLobby() {
    const [onlineUsers, lastVisitedUsers, topRankUsers] = await Promise.all([
      this.usersService.findOnline(30),
      this.usersService.findLastVisited(30),
      this.usersService.findTopRanked(30),
    ]);

    return {
      announcement: 'Welcome to Hi2Chat Lobby',
      onlineUsers,
      lastVisitedUsers,
      topRankUsers,
    };
  }

  async sendMessage(senderId: string, dto: SendLobbyMessageDto) {
    const message = this.lobbyMessagesRepository.create({
      senderId,
      room: dto.room || 'lobby',
      content: dto.content,
      messageType: dto.messageType || 'text',
      replyToMessageId: dto.replyToMessageId,
      status: 'sent',
      isEdited: false,
      isDeleted: false,
    });

    return this.lobbyMessagesRepository.save(message);
  }

  history(room = 'lobby', limit = 50) {
    return this.lobbyMessagesRepository
      .createQueryBuilder('message')
      .where('message.room = :room', { room })
      .andWhere('message.isDeleted = :isDeleted', { isDeleted: false })
      .orderBy('message.createdAt', 'DESC')
      .take(limit)
      .getMany();
  }

  async editMessage(messageId: string, senderId: string, content: string) {
    const message = await this.lobbyMessagesRepository.findOne({
      where: { id: messageId, senderId },
    });

    if (!message) throw new NotFoundException('Lobby message not found');

    message.content = content;
    message.isEdited = true;

    return this.lobbyMessagesRepository.save(message);
  }

  async removeMessage(messageId: string, senderId: string) {
    const message = await this.lobbyMessagesRepository.findOne({
      where: { id: messageId, senderId },
    });

    if (!message) throw new NotFoundException('Lobby message not found');

    message.isDeleted = true;
    message.content = '';

    await this.lobbyMessagesRepository.save(message);
    return { success: true, messageId };
  }
}
