import { Injectable } from '@nestjs/common';
import { PrismaService } from '@core/database/prisma/prisma.service';
import { Prisma } from '@prisma/client';

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

  listRequiredAttendees(meetingId: string) {
    return this.prisma.meetingRequiredAttendee.findMany({
      where: { meetingId },
      include: {
        user: {
          select: {
            id: true,
            displayName: true,
            email: true,
            workCity: true,
            departmentMemberships: {
              where: { leftAt: null },
              include: {
                department: { select: { id: true, name: true, code: true } },
                position: { select: { id: true, name: true, level: true } },
              },
            },
          } as any,
        },
      },
    });
  }

  createRequiredAttendees(data: Prisma.MeetingRequiredAttendeeCreateManyInput[]) {
    return this.prisma.meetingRequiredAttendee.createMany({ data });
  }

  deleteRequiredAttendees(meetingId: string, userId: string) {
    return this.prisma.meetingRequiredAttendee.deleteMany({
      where: { meetingId, userId },
    });
  }

  countRequiredAttendees(meetingId: string) {
    return this.prisma.meetingRequiredAttendee.count({
      where: { meetingId },
    });
  }

  findRequiredAttendeesByUsers(meetingId: string, userIds: string[]) {
    return this.prisma.meetingRequiredAttendee.findMany({
      where: { meetingId, userId: { in: userIds } },
      select: { userId: true },
    });
  }

  listRequiredAttendeesWithUsers(meetingId: string) {
    return this.prisma.meetingRequiredAttendee.findMany({
      where: { meetingId },
      include: {
        user: {
          select: {
            id: true,
            displayName: true,
            email: true,
            roles: { include: { role: true } },
          },
        },
      },
    });
  }

  findAttendeeForMeeting(meetingId: string) {
    return this.prisma.meetingRequiredAttendee.findMany({
      where: { meetingId },
      include: {
        user: {
          select: {
            id: true,
            displayName: true,
            email: true,
            roles: { include: { role: true } },
          },
        },
      },
    });
  }
}
