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

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

  // Alle Fächer abrufen
  async findAll() {
    return this.prisma.subject.findMany({
      orderBy: { name: 'asc' },
      include: {
        _count: {
          select: { timetableEntries: true },
        },
      },
    });
  }

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

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

    return subject;
  }

  // Neues Fach erstellen (nur Lehrer)
  async create(dto: CreateSubjectDto) {
    try {
      return await this.prisma.subject.create({
        data: dto,
      });
    } catch (error) {
      if (error.code === 'P2002') {
        throw new ConflictException('Ein Fach mit diesem Namen existiert bereits');
      }
      throw error;
    }
  }

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

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

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

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