import { Injectable, NotFoundException, ConflictException } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import { CreateRoomDto, UpdateRoomDto } from './dto';

@Injectable()
export class RoomsService {
  constructor(private prisma: PrismaService) {}

  // Alle Räume abrufen
  async findAll() {
    return this.prisma.room.findMany({
      orderBy: { number: 'asc' },
      include: {
        _count: {
          select: { timetableEntries: true },
        },
      },
    });
  }

  // Einen Raum nach ID abrufen
  async findOne(id: number) {
    const room = await this.prisma.room.findUnique({
      where: { id },
      include: {
        _count: {
          select: { timetableEntries: true },
        },
      },
    });

    if (!room) {
      throw new NotFoundException(`Raum mit ID ${id} nicht gefunden`);
    }

    return room;
  }

  // Neuen Raum erstellen (nur Lehrer)
  async create(dto: CreateRoomDto) {
    try {
      return await this.prisma.room.create({
        data: dto,
      });
    } catch (error) {
      if (error.code === 'P2002') {
        throw new ConflictException('Ein Raum mit dieser Nummer existiert bereits');
      }
      throw error;
    }
  }

  // Raum aktualisieren (nur Lehrer)
  async update(id: number, dto: UpdateRoomDto) {
    await this.findOne(id); // Prüfen, ob Raum existiert

    try {
      return await this.prisma.room.update({
        where: { id },
        data: dto,
      });
    } catch (error) {
      if (error.code === 'P2002') {
        throw new ConflictException('Ein Raum mit dieser Nummer existiert bereits');
      }
      throw error;
    }
  }

  // Raum löschen (nur Lehrer)
  async delete(id: number) {
    await this.findOne(id); // Prüfen, ob Raum existiert

    try {
      await this.prisma.room.delete({
        where: { id },
      });
      return { message: 'Raum erfolgreich gelöscht' };
    } catch (error) {
      if (error.code === 'P2003') {
        throw new ConflictException('Raum kann nicht gelöscht werden, da er noch in Stundenplan-Einträgen verwendet wird');
      }
      throw error;
    }
  }
}
