import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';

@Injectable()
export class AttendanceService {
  constructor(private prisma: PrismaService) {}

  async findByEmployee(employeeId: number, from?: Date, to?: Date) {
    return this.prisma.attendance.findMany({
      where: {
        employeeId,
        ...(from || to
          ? {
              punchTime: {
                ...(from ? { gte: from } : {}),
                ...(to ? { lte: to } : {}),
              },
            }
          : {}),
      },
      orderBy: { punchTime: 'desc' },
      take: 500,
    });
  }

  async findByDateRange(from: Date, to: Date, employeeId?: number) {
    return this.prisma.attendance.findMany({
      where: {
        punchTime: { gte: from, lte: to },
        ...(employeeId ? { employeeId } : {}),
      },
      orderBy: [{ punchTime: 'asc' }],
      include: { employee: true },
    });
  }

  async createManual(data: {
    employeeId: number;
    punchTime: Date;
    punchType: string;
  }) {
    return this.prisma.attendance.create({
      data: {
        employeeId: data.employeeId,
        punchTime: data.punchTime,
        punchType: data.punchType || 'in',
        source: 'manual',
      },
      include: { employee: true },
    });
  }

  async getWorkedDays(employeeId: number, year: number, month: number): Promise<number> {
    const start = new Date(year, month - 1, 1);
    const end = new Date(year, month, 0, 23, 59, 59);
    const records = await this.prisma.attendance.findMany({
      where: {
        employeeId,
        punchTime: { gte: start, lte: end },
      },
      orderBy: { punchTime: 'asc' },
    });

    const days = new Set<string>();
    for (const r of records) {
      days.add(r.punchTime.toISOString().slice(0, 10));
    }
    return days.size;
  }
}
