import { getPrisma } from '../infrastructure/database/PrismaSingleton';
import { leave_requests, Prisma } from '@prisma/client';

export class LeaveRepository {
  private prisma = getPrisma();

  create(data: Prisma.leave_requestsCreateInput): Promise<leave_requests> {
    return this.prisma.leave_requests.create({ data });
  }

  findById(id: string) {
    return this.prisma.leave_requests.findUnique({
      where: { id },
      include: { leave_request_approvals: true },
    });
  }

  listByEmployee(employeeId: string, status?: string) {
    return this.prisma.leave_requests.findMany({
      where: {
        employee_id: employeeId,
        ...(status ? { status: status as never } : {}),
      },
      include: { leave_request_approvals: true },
      orderBy: { submitted_at: 'desc' },
    });
  }

  update(id: string, data: Prisma.leave_requestsUpdateInput) {
    return this.prisma.leave_requests.update({
      where: { id },
      data,
      include: { leave_request_approvals: true },
    });
  }

  countEmergencyInQuarter(employeeId: string, quarterStart: Date, quarterEnd: Date) {
    return this.prisma.leave_requests.count({
      where: {
        employee_id: employeeId,
        leave_type: 'EMERGENCY_MEDICAL',
        status: { in: ['PENDING', 'APPROVED', 'PENDING_BACKDATE_APPROVAL', 'APPROVED_PENDING_MARK'] },
        start_date: { gte: quarterStart, lte: quarterEnd },
      },
    });
  }

  findApprovedOverlapping(employeeId: string, date: Date) {
    return this.prisma.leave_requests.findFirst({
      where: {
        employee_id: employeeId,
        status: 'APPROVED',
        start_date: { lte: date },
        end_date: { gte: date },
      },
    });
  }

  findApprovedInRange(from: Date, to: Date) {
    return this.prisma.leave_requests.findMany({
      where: {
        status: 'APPROVED',
        start_date: { lte: to },
        end_date: { gte: from },
      },
    });
  }
}
