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

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

  listTemplates(userId: string) {
    return this.prisma.meetingTemplate.findMany({
      where: {
        OR: [{ creatorId: userId }, { isPublic: true }],
      },
      include: {
        creator: { select: { displayName: true, email: true } },
        templateAttendees: {
          include: {
            user: {
              select: {
                id: true,
                displayName: true,
                email: true,
                departmentMemberships: {
                  where: { leftAt: null },
                  include: {
                    department: { select: { id: true, name: true, code: true } },
                    position: { select: { id: true, name: true, level: true } },
                  },
                },
              },
            },
          },
        },
      },
      orderBy: { updatedAt: 'desc' },
    });
  }

  findTemplateById(id: string) {
    return this.prisma.meetingTemplate.findUnique({
      where: { id },
      include: {
        templateAttendees: { include: { user: true } },
      },
    });
  }

  createTemplate(data: Prisma.MeetingTemplateCreateInput) {
    return this.prisma.meetingTemplate.create({ data });
  }

  updateTemplate(id: string, data: Prisma.MeetingTemplateUpdateInput) {
    return this.prisma.meetingTemplate.update({ where: { id }, data });
  }

  deleteTemplate(id: string) {
    return this.prisma.meetingTemplate.delete({ where: { id } });
  }

  createTemplateAttendees(data: Prisma.MeetingTemplateAttendeeCreateManyInput[]) {
    return this.prisma.meetingTemplateAttendee.createMany({ data });
  }

  deleteTemplateAttendees(templateId: string) {
    return this.prisma.meetingTemplateAttendee.deleteMany({ where: { templateId } });
  }
}
